解析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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/811982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++项目——集群聊天服务器项目(十四)客户端业务

大家好~前段时间有些事情需要处理&#xff0c;没来得及更新&#xff0c;实在不好意思。 今天来继续更新集群聊天服务器项目的客户端功能&#xff0c;主要实现客户端业务&#xff0c;包括添加好友、点对点聊天、创建群组、添加群组、群组聊天业务&#xff0c;接下来我们一起来敲…

Prompt 工程技术提问的艺术,如何向 ChatGPT 提问?

Prompt 工程技术简介 什么是 Prompt 工程&#xff1f; Prompt 工程是创建提示或指导像 ChatGPT 这样的语言模型输出的过程。它允许用户控制模型的输出并 生成符合其特定需求的文本。ChatGPT 是一种先进的语言模型&#xff0c;能够生成类似于人类的文本。它建立在 Transformer 架…

FPGA基于VCU的H265视频解压缩,解码后HDMI2.0输出,支持4K60帧,提供工程源码+开发板+技术支持

目录 1、前言免责声明 2、相关方案推荐我这里已有的视频图像编解码方案4K60帧HDMI2.0输入&#xff0c;H265视频压缩方案 3、详细设计方案设计框图FPGA开发板解压视频源Zynq UltraScale VCUVideo Frame Buffer ReadVideo MixerHDMI 1.4/2.0 Transmitter SubsystemVideo PHY Cont…

316_C++_xml文件解析成map,可以放到表格上 + xml、xlsx文件互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…

情怀无价:重拾记忆的魅力——照片质量修复探究(下)

在前一篇文章中&#xff0c;我们介绍了如何利用AI图像提升工具&#xff1a;提高图片的分辨率。本文将继续探讨这一话题&#xff0c;深入了解如何使用 Selenium 和 AutoIt 这两个工具来实现自动化处理图片的任务。 视频演示 【审核中】 自动化任务概述 首先&#xff0c;让我…

milvus各组件的结构体分析2

milvus各组件的结构体分析2 分析各组件的服务端API。 rootcoord // Server grpc wrapper type Server struct {//自身提供的api功能接口rootCoord types.RootCoordComponentgrpcServer *grpc.ServergrpcErrChan chan errorwg sync.WaitGroupctx context.Contextcancel…

docker操作详解

Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。使用 Docker&#xff0c;你可以很方便地部署和扩展应用程序&#xff0c;并且可以按…

【JVM】避免java内存泄漏、溢出的几种方法

1.尽早释放无用对象的引用。 好的办法是使用临时变量的时候&#xff0c;让引用变量在退出活动域后自动设置为null&#xff0c;暗示垃圾收集器来收集该对象&#xff0c;防止发生内存泄露。 2. 程序进行字符串处理时&#xff0c;尽量避免使用String&#xff0c;应使用StringBuffe…

必应bing搜索广告推广国内能开户吗?

随着互联网广告市场的不断进化和细分化&#xff0c;必应Bing搜索广告已逐渐成为中国企业拓展国内市场、精准触达目标客户的重要渠道之一。2024年&#xff0c;必应Bing在国内市场的进一步布局&#xff0c;不仅彰显了其对本土企业的强大吸引力&#xff0c;更带来了全新的开户政策…

【网站项目】驾校预约管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【opencv】示例-image_alignment.cpp 利用ECC 算法进行图像对齐

affine imshow("image", target_image); imshow("template", template_image); imshow("warped image", warped_image); imshow("error (black: no error)", abs(errorImage) * 255 / max_of_error); homography 这段代码是一个利用EC…

「51媒体网」汽车类媒体有哪些?车展媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 汽车类媒体有很多&#xff0c;具体如下&#xff1a; 汽车之家&#xff1a;提供全面的汽车新闻、评测、导购等内容。 爱卡汽车&#xff1a;同样是一个综合性的汽车信息平台&#xff0c;涵…

2024 年适用于 Mac 电脑的最佳 SD 卡恢复软件

D 卡体积很小&#xff0c;广泛用于数码相机、摄像机、行车记录仪、无人机等。通常&#xff0c;在使用设备拍照、拍摄视频后&#xff0c;您会将文件移动到 Mac 进行进一步编辑或作为备份。大多数时候&#xff0c;应该存在问题。但是&#xff0c;您的 SD 卡仍然会出现一些问题并导…

Harmony鸿蒙南向驱动开发-Regulator接口使用

功能简介 Regulator模块用于控制系统中某些设备的电压/电流供应。在嵌入式系统&#xff08;尤其是手机&#xff09;中&#xff0c;控制耗电量很重要&#xff0c;直接影响到电池的续航时间。所以&#xff0c;如果系统中某一个模块暂时不需要使用&#xff0c;就可以通过Regulato…

Excel/WPS超级处理器,提取汉字/字母/数字

在职场工作中&#xff0c;经常会遇到单元格中有汉字&#xff0c;数字&#xff0c;字母三者的自由组合&#xff0c;但往往只需要其中的一者&#xff0c;如何快速提取呢&#xff0c;超级处理器&#xff0c;提供了4个功能可选。 超级处理器下载与安装 1&#xff09;分离字符 将…

平板设备IP地址设置指南

在数字化时代&#xff0c;平板电脑作为便携且功能强大的设备&#xff0c;广泛应用于日常生活和工作中。为了确保平板能够正常接入网络并与其他设备进行通信&#xff0c;正确设置IP地址是至关重要的。虎观小二将为您介绍如何设置平板的IP地址&#xff0c;帮助您轻松完成网络配置…

unity在linux环境下videoplayer 无法播放问题解决路径

1、问题 一个项目需要在linux下播放视频&#xff0c;并且视频在机器上&#xff0c;也就是要使用应用外的视频文件进行播放。 视频的格式当前提供的事avi格式&#xff0c;并且使用videoplayer 在windows下播放正常。 但是发出包之后再Ubuntu环境怎么都无法播放。 2、测试环境…

LDF、DBC、BIN、HEX、S19、BLF、ARXML、slx等

文章目录 如题 如题 LDF是LIN报文格式文件&#xff0c;把这个直接拖到软件里面&#xff0c;可以发报文和接收报文 DBC是CAN报文格式文件&#xff0c;把这个直接拖到软件里面&#xff0c;可以发报文和接收报文 BIN文件烧录在BOOT里面&#xff08;stm32&#xff09;&#xff0c…

开源无需授权2024最新同城上门预约家政按摩小程序+公众号H5+APP源码系统下载

2024最新同城上门预约家政按摩源码简介&#xff1a; 开源无需授权2024最新同城上门预约家政按摩小程序&#xff0b;公众号H5&#xff0b;APP源码系统下载&#xff0c;前端采用uni-app开发&#xff0c; 后端thinkphp框架开发。适配多端&#xff08;小程序&#xff0b;公众号H5&…

php反序列化(2)

一.pop链 在反序列化中&#xff0c;我们能控制的数据就是对象中的属性值&#xff08;成员变量&#xff09;&#xff0c;所以在php反序列化中有一种漏洞利用方法叫“面向属性编程”&#xff0c;即pop&#xff08;property oriented programming&#xff09;。 pop链就是利用魔…