解析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家最新的三维电磁(EM)仿真软件ANSYS Electromagnetics Suite 2023 R2日前发布了,老wu这次分享得有点晚  ̄ω ̄,现在已经将资源上传到了网盘供大家免费下载,同时,为了让大家都能与…...

pbootcms百度推广链接打不开显示404错误页面
PbootCMS官方在2023年4月21日的版本更新中(对应V3.2.5版本),对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-缓存穿透与雪崩
一,缓存穿透(查不到) 在默认情况下,用户请求数据时,会先在缓存(Redis)中查找,若没找到即缓存未命中,再在数据库中进行查找,数量少可能问题不大,可是一旦大量的请求数据&a…...
K8S临时存储-本地存储-PV和PVC的使用-动态存储(StorageClass)
介绍 容器中的文件在磁盘上是临时存放的,当容器崩溃或停止时容器上面的数据未保存, 因此在容器生命周期内创建或修改的所有文件都将丢失。 在崩溃期间,kubelet 会以干净的状态重新启动容器。 当多个容器在一个 Pod 中运行并且需要共享文件时…...

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

Unity面经(自整)——移动开发与Shader
Unity与Android混合开发 为什么使用Flutter构建 Flutter 是 Google 的开源工具包,用于从单个代码库为移动、Web、桌面和嵌入式设备构建应用程序(一套代码跨平台构建app是它最大的优点),并且可以构建高性能、稳定和丰富UI的应用程…...
Nginx实现反向代理、负载均衡、动静分离
1. 什么是Nginx的反向代理? Nginx的反向代理是指Nginx作为服务器的前端,接收客户端的请求,然后将请求转发给后端的真实服务器,并将真实服务器的响应返回给客户端。这种代理方式使得客户端并不知道真实服务器的存在,它…...

【Linux】网络基础(一)
文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层(或四层)模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…...
前端小白学习Vue框架(二)
一.属性计算、属性监听、属性过滤 1.认识MVVM V (用户视图界面)通过VM (应用程序) 向Model(数据模型) 取值与赋值的过程! 数据双向绑定 视图改变更新数据,数据改变更新视图 2.属性计算 //在vue实例中通过computed去计算new …...

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

CSS3 平面 2D 变换+CSS3 过渡
个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍一、CSS3 平面 2D 变换💎1 坐标轴💎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 综合练习 学习目标 这一节,我们从 案例解读、脚本实践、小结 三个方面来学习。 案例解读 案例需求 使用shell脚本绘制一个杨辉三角案例解读 1、每行数字左右对称,从1开始变大,然后变小为1。 2、第n行的数字个数为n个…...

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

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

Unity Standalone File Browser,Unity打开文件选择器
Unity Standalone File Browser,Unity打开文件选择器 下载地址:GitHub链接: https://github.com/gkngkc/UnityStandaloneFileBrowser简单的示例代码 using SFB; using System; using System.IO; using UnityEngine; using UnityEngine.UI;…...
面向对象的架构三段式写一篇论文
在面向对象的软件架构中,系统设计通常遵循一种“三段式”方法论,以确保软件的可扩展性、可维护性和灵活性。这种方法论包括三个核心阶段:概念化、详细设计和实现。通过这三个阶段的逐步深入,开发团队可以有效地应对复杂系统的挑战…...
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 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一: 清除npm缓存 npm cache clean --force 取消ssl验证: npm config set strict-…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...