当前位置: 首页 > news >正文

解析mysql的DDL语句生成高斯内表及表字段主键配置

mysql的DDL语句如下:

CREATE TABLE `gg_zr` (`id` bigint(20) NOT NULL COMMENT '责任信息表主键id',`zrdm` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '责任代码',`zrmc` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '责任名称',`delflag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT '0' COMMENT '删除标志(0.存在;1.删除)',`version` int(11) DEFAULT '1' COMMENT '版本号',`createby` bigint(20) DEFAULT NULL COMMENT '创建人',`createtime` datetime DEFAULT NULL COMMENT '创建时间',`updateby` bigint(20) DEFAULT NULL COMMENT '修改人',`updatetime` datetime DEFAULT NULL COMMENT '修改时间',PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC COMMENT='责任信息表';

解析oracle表生成高斯内表入口:Mysql2GaussCreateMana.scala

package com.tpiods.sqoop.mysql2gaussimport java.io.{File, FileInputStream, PrintWriter}
/*** 读取mysql建表语句,生成高斯内表* 读取oceanbase建表语句,生成高斯内表* 仅93行提取主键的逻辑,mysql与oceanbase有差异*/
object Mysql2GaussCreateMana {def main(args: Array[String]): Unit = {// 指定输入sql语句的文件val input = "ods_etl/src/main/resources/work0409_test1/test1_tab.sql"val lines = scala.io.Source.fromInputStream(new FileInputStream(input)).getLines()val str = readSql(lines)val result = replaceSql(str)// 读上一步输出的文件val str2 = addTeacCols3(result)// 指定输出sql语句的文件(增加技术字段)val output2 = "ods_etl/src/main/resources/work0409_test1/test1_tab_mana.sql"val writer2 = new PrintWriter(new File(output2))writer2.write(str2)writer2.close()}/**** @param lines 从文件读入的源系统建表语句* @return 返回转换后的建表语句*/def readSql(lines: Iterator[String]): String = {var first = 0val sb = new StringBuildervar pkName: String = nullfor (line <- lines if line != null) {if(line.startsWith("CREATE")) {val tabName = line.split("\\s+")(2)first += 1if (sb.nonEmpty) {// 不按主键做hash,则注释掉下面这段代码sb.append(s"""|)|with (orientation=column, compression=low)|distribute by hash${pkName};""".stripMargin)sb.append(s"""||set search_path = ods;|drop table if exists ${tabName};|create table if not exists ${tabName} (\t|""".stripMargin)}else {sb.append(s"""||set search_path = tpods;|drop table if exists ${tabName};|create table if not exists ${tabName} (\t|""".stripMargin)}}if (line.startsWith("  `")) {val split = line.split("\\s+")if (first == 1) {val ln = (split(1) + "\t" + split(2)).toLowerCaseif (ln.indexOf("char(") > 0) {val l1 = ln.split("\\(")(0)val l2 = ln.split("\\(")(1)val l3 = l2.substring(0, l2.length - 1)val l4 = Integer.valueOf(l3) * 3sb.append(l1).append("(").append(l4).append(")")}else sb.append(split(1)).append("\t").append(split(2))}else {val ln = (split(1) + "\t" + split(2)).toLowerCaseif (ln.indexOf("char(") > 0) {val l1 = ln.split("\\(")(0)val l2 = ln.split("\\(")(1)val l3 = l2.substring(0, l2.length - 1)val l4 = Integer.valueOf(l3) * 3sb.append(",").append(l1).append("(").append(l4).append(")")}else sb.append(",").append(split(1)).append("\t").append(split(2))}sb.append("\n")first = 0}if (line.startsWith("  PRIMARY KEY")) {//取mysql 主键pkName = line.split("\\s+")(3)}}sb +s"""|)|WITH (orientation=column, compression=low)|distribute by hash${pkName};|""".stripMargin// 不按主键做hash,打开下面这段代码
//    sb.toString()}/**** @param sql 读入转换后的sql* @return 对字段类型进行替换,返回最终的sql*/def replaceSql(sql: String): String = {val res = sql.toLowerCase.replaceAll("`", "").replaceAll("\\b" + "datetime" + "\\b", "date").replaceAll("tinyint\\(\\d*\\)", "int").replaceAll("smallint\\(\\d*\\)", "int").replaceAll("int\\(\\d*\\)", "int").replaceAll("bigint\\(\\d*\\)", "bigint").replaceAll("float\\(\\d*,\\d*\\)", "float").replaceAll("double\\(\\d*,\\d*\\)", "float").replaceAll("timestamp\\(\\d*\\)", "timestamp").replaceAll("date\\(\\d*\\)", "date").replaceAll("\\b" + "longtext" + "\\b", "text").replaceAll("\\b" + "longblob" + "\\b", "varchar").replaceAll(",\n", "\n").replaceAll("mediumtext", "text")res + "\n"}/*** 按主键做hash* @param lines2 读入字段类型替换后的sql* @return 字段后面增加技术字段*/def addTeacCols(lines2: String): String = {lines2.replaceAll("\n\\)\nwith",""",oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|)|with""".stripMargin)}/*** 不按主键做hash,调用这个方法* @param lines2 读入字段类型替换后的sql* @return 字段后面增加技术字段*/def addTeacCols2(lines2: String): String = {lines2.replaceAll("\\);",""",oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|);|""".stripMargin)}/*** 按主键做hash* @param lines2 读入字段类型替换后的sql* @return 字段前面增加技术字段*/def addTeacCols3(lines2: String): String = {lines2.replaceAll("\t\n","""| tabname varchar|,oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|,""".stripMargin)}/*** 不按主键做hash,调用这个方法* @param lines2 读入字段类型替换后的sql* @return 字段前面增加技术字段*/def addTeacCols4(lines2: String): String = {lines2.replaceAll("\t\n","""| tabname varchar|,oper	varchar|,mtime	numeric(38,5)|,source_sys	varchar|,etl_time	varchar|,etl_date	varchar|,""".stripMargin)}}

运行以上代码,输出如下:

set search_path = ods;
drop table if exists gg_zr;
create table if not exists gg_zr (
tabname varchar
,oper varchar
,mtime numeric(38,5)
,source_sys varchar
,etl_time varchar
,etl_date varchar
,id bigint
,zr_dm varchar(96)
,zr_mc varchar(192)
,del_flag char(3)
,version int
,create_by bigint
,create_time date
,update_by bigint
,update_time date

)
with (orientation=column, compression=low)
distribute by hash(id);

解析oracle表生成表名字段主键配置入口:MysqlGeneTabColsPk.scala

package com.tpiods.sqoop.mysql2gaussimport java.io.{File, FileInputStream, PrintWriter}
/*** 输入: 源系统建表语句* 输出: 表名|列名...|主键* 仅36行提取主键的逻辑,mysql与oceanbase有差异*/
object MysqlGeneTabColsPk {def main(args: Array[String]): Unit = {// 指定输入sql语句的文件val input = "ods_etl/src/main/resources/work0409_test1/test1_tab.sql"val lines = scala.io.Source.fromInputStream(new FileInputStream(input)).getLines()val str = readSql(lines)// 指定输出sql语句的文件val output1 = "ods_etl/src/main/resources/work0409_test1/test1_tab_tabcolspk.txt"val writer = new PrintWriter(new File(output1))writer.write(str)writer.close()}def readSql(lines: Iterator[String]): String = {val sb = new StringBuilderfor (tempString <- lines if tempString != null) {if (tempString.startsWith("CREATE")) {val tabName = tempString.split("TABLE `")(1)sb.append("\n").append(tabName).append("|")}if (tempString.startsWith("  `")) {val colName = tempString.split("\\s+")(1)sb.append(colName).append(",")}if (tempString.startsWith("  PRIMARY KEY")) {
//         var pkName = tempString.split("\\s+")(3)//取oceanbase 主键var pkName = tempString.replaceAll("  PRIMARY KEY ", "")if (pkName.endsWith(",")) {pkName = pkName.substring(0, pkName.length - 1).replaceAll(" ", "")}sb.append("|").append(pkName)}}sb.toString().toLowerCase().replaceAll("` ", "").replaceAll("`", "").replaceAll("\\(", "").replaceAll("\\)", "").replaceAll(",\\|", "\\|").replaceAll(",\n", "\n")}}

运行以上代码,输出如下:

gg_zr|id,zr_dm,zr_mc,del_flag,version,create_by,create_time,update_by,update_time|id

相关文章:

解析mysql的DDL语句生成高斯内表及表字段主键配置

mysql的DDL语句如下: CREATE TABLE gg_zr (id bigint(20) NOT NULL COMMENT 责任信息表主键id,zrdm varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 责任代码,zrmc varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAU…...

ANSYS Electromagnetics Suite 2023 R2 三维电磁(EM)仿真软件下载

Ansys家最新的三维电磁&#xff08;EM&#xff09;仿真软件ANSYS Electromagnetics Suite 2023 R2日前发布了&#xff0c;老wu这次分享得有点晚 &#xffe3;ω&#xffe3;&#xff0c;现在已经将资源上传到了网盘供大家免费下载&#xff0c;同时&#xff0c;为了让大家都能与…...

pbootcms百度推广链接打不开显示404错误页面

PbootCMS官方在2023年4月21日的版本更新中&#xff08;对应V3.2.5版本&#xff09;&#xff0c;对URL参数添加了如下判断 if(stripos(URL,?) ! false && stripos(URL,/?tag) false && stripos(URL,/?page) false && stripos(URL,/?ext_) false…...

springboot 整合 swagger2

整合步骤 pom 添加依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId>&…...

redis-缓存穿透与雪崩

一&#xff0c;缓存穿透&#xff08;查不到&#xff09; 在默认情况下&#xff0c;用户请求数据时&#xff0c;会先在缓存(Redis)中查找&#xff0c;若没找到即缓存未命中&#xff0c;再在数据库中进行查找&#xff0c;数量少可能问题不大&#xff0c;可是一旦大量的请求数据&a…...

K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)

介绍 容器中的文件在磁盘上是临时存放的&#xff0c;当容器崩溃或停止时容器上面的数据未保存&#xff0c; 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间&#xff0c;kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时…...

jeecg-boot安装

我看大家都挺关注&#xff0c;所以集中上传了下代码和相关工具&#xff0c;方便大家快速完成 链接&#xff1a;https://pan.baidu.com/s/1-Y9yHVZ-4DQFDjPBWUk4-A 提取码&#xff1a;op1r 1. 下载代码 下载地址 : JEECG官方网站 - 基于BPM的低代码开发平台(低代码平台_零代…...

Unity面经(自整)——移动开发与Shader

Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包&#xff0c;用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序&#xff08;一套代码跨平台构建app是它最大的优点&#xff09;&#xff0c;并且可以构建高性能、稳定和丰富UI的应用程…...

Nginx实现反向代理、负载均衡、动静分离

1. 什么是Nginx的反向代理&#xff1f; Nginx的反向代理是指Nginx作为服务器的前端&#xff0c;接收客户端的请求&#xff0c;然后将请求转发给后端的真实服务器&#xff0c;并将真实服务器的响应返回给客户端。这种代理方式使得客户端并不知道真实服务器的存在&#xff0c;它…...

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…...

前端小白学习Vue框架(二)

一.属性计算、属性监听、属性过滤 1.认识MVVM V &#xff08;用户视图界面&#xff09;通过VM (应用程序) 向Model(数据模型) 取值与赋值的过程&#xff01; 数据双向绑定 视图改变更新数据&#xff0c;数据改变更新视图 2.属性计算 //在vue实例中通过computed去计算new …...

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…...

CSS3 平面 2D 变换+CSS3 过渡

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 ✍一、CSS3 平面 2D 变换&#x1f48e;1 坐标轴&#x1f48e;2 transform 语法…...

【Jenkins】Jenkins自动化工具介绍

目录 技术背景常规的手动打包步骤 Jenkins简介起源与发展Jenkins的核心价值1.自动化1.1代码构建1.2测试自动化1.3自动部署 2.持续集成与持续部署CI/CD的概念如何减少集成问题更快速地发布软件版本 Jenkins优势Jenkins的主要竞争对手Travis CI:CircleCI:GitLab CI: Jenkins与其他…...

课时93:流程控制_函数进阶_综合练习

1.1.3 综合练习 学习目标 这一节&#xff0c;我们从 案例解读、脚本实践、小结 三个方面来学习。 案例解读 案例需求 使用shell脚本绘制一个杨辉三角案例解读 1、每行数字左右对称&#xff0c;从1开始变大&#xff0c;然后变小为1。    2、第n行的数字个数为n个&#xf…...

oracle创建整个数据库的只读账户

在源用户readonly 下创建只读用户 reader readonly 的表空间为AA 一、创建只读用户 create user reader identified by 密码 default tablespace AA; 二、授权 grant connect to reader ; 三、获取原账号readonly 的查询权限 select grant select on ||owner||.||object…...

文件名乱码危机:数据恢复全攻略

在数字化时代的浪潮中&#xff0c;电脑文件成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;有时我们会突然遭遇一个令人头疼的问题&#xff1a;原本清晰易读的文件名突然变成了乱码。这些乱码文件名不仅让我们无法准确识别文件内容&#xff0c;更可能意味着数据丢…...

Unity Standalone File Browser,Unity打开文件选择器

Unity Standalone File Browser&#xff0c;Unity打开文件选择器 下载地址&#xff1a;GitHub链接&#xff1a; https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…...

面向对象的架构三段式写一篇论文

在面向对象的软件架构中&#xff0c;系统设计通常遵循一种“三段式”方法论&#xff0c;以确保软件的可扩展性、可维护性和灵活性。这种方法论包括三个核心阶段&#xff1a;概念化、详细设计和实现。通过这三个阶段的逐步深入&#xff0c;开发团队可以有效地应对复杂系统的挑战…...

npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED

解决npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一&#xff1a; 清除npm缓存 npm cache clean --force 取消ssl验证&#xff1a; npm config set strict-…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...