在Oracle、MySQL中执行sql脚本生成hive建表语句

本文介绍了一种从MySQL和Oracle数据库元数据自动生成Hive建表语句的方法,包括数据类型映射和注释处理,适用于数据迁移场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

python3脚本:

#mysql
for i in range(len(table_name)):
    sql1 = """SELECT
    CONCAT('create table ','%s','(')
UNION ALL
SELECT
    CONCAT(
        COLUMN_NAME,
        ' ',
        CASE
    WHEN DATA_TYPE in ('varchar','longtext','char','datetime','timestamp','varbinary','bit','mediumtext','set','longblob','text','blob','time','date') THEN
        'string'
    WHEN DATA_TYPE = 'decimal' THEN
        COLUMN_TYPE
   WHEN DATA_TYPE = 'float' THEN
        'double'
    ELSE 
        DATA_TYPE
    END -- 数据类型转换
    ,
    ' comment ',
    '\\'',
    CASE
    WHEN COLUMN_COMMENT is NULL THEN
        COLUMN_NAME
    ELSE
        replace(COLUMN_COMMENT,';',',')
    END,
    '\\','
    )
FROM
    information_schema. COLUMNS t1
WHERE
     t1.table_schema = 'lqioc_ioc_yw'
 and t1.TABLE_NAME = '%s'
UNION ALL
SELECT
    concat(
        ')',
        'COMMENT \\'',
        COALESCE (t2.TABLE_COMMENT ,'%s'),
        '\\'
-- PARTITIONED BY (DATE STRING COMMENT \\'日期分区\\') -- 分区表取消注释
ROW FORMAT DELIMITED FIELDS TERMINATED BY \\',\\' STORED AS TEXTFILE;'
        )
    FROM
        information_schema. TABLES t2
    WHERE
        t2.table_schema = 'lqioc_ioc_yw'
    and t2.table_name = '%s'
union all 
""" % (table_name[i],table_name[i],table_name[i],table_name[i])

#oracle
for i in range(len(table_name)):
    sql1 = """SELECT 'create table lqioc_ioc_ods.' || '%s' || ' (' FROM dual UNION ALL
    	SELECT
    		col
    	FROM
    		(
    			SELECT
    				T .column_name || CASE
    			WHEN c.DATA_TYPE IN (
    				'CHAR',
    				'NCHAR',
    				'VARCHAR',
    				'VARCHAR2',
    				'NVARCHAR2',
    				'DATE',
    				'TIMESTAMP',
    				'TIMESTAMP WITH TIME ZONE',
    				'TIMESTAMP WITH LOCAL TIME ZONE',
    				'INTERVAL YEAR TO MOTH',
    				'INTERVAL DAY TO SECOND',
    				'BLOB',
    				'CLOB',
    				'NCLOB',
    				'BFILE',
    				'RAW',
    				'LONG RAW'
    			) THEN
    				' STRING '
    			WHEN C.DATA_TYPE = 'INTEGER' THEN
    				' BIGINT '
    			WHEN C.DATA_TYPE = 'NUMBER' THEN
    				(
    					CASE
    					WHEN C.DATA_SCALE IS NOT NULL
    					AND c.DATA_SCALE <> 0 THEN
    						' DECIMAL(' || C.DATA_PRECISION || ',' || C.DATA_SCALE || ') '
    					WHEN C.DATA_PRECISION < 3 THEN
    						' TINYINT '
    					WHEN C.DATA_PRECISION < 5 THEN
    						' SMALLINT '
    					WHEN C.DATA_PRECISION < 10 THEN
    						' INT '
    					ELSE
    						' BIGINT '
    					END
    				)
    			WHEN C.DATA_TYPE IN (
    				'BINARY_FLOAT',
    				'BINARY_DOUBLE',
    				'FLOAT'
    			) THEN
    				' DOUBLE '
    			ELSE
    				' STRING '
    			END || 'comment ''' || REGEXP_REPLACE (
    				T .comments,
    				'[' || CHR (10) || CHR (13) || CHR (9) || CHR (32) || ']',
    				''
    			) || ''',' col
    			FROM
    				all_COL_COMMENTS T,
    				all_TAB_COLUMNS c
    			WHERE
    				c.column_name = T .column_name
    			AND c. OWNER = T . OWNER
    			AND c.TABLE_NAME = T .TABLE_NAME
    			AND c. OWNER = 'SJGJ'
    			AND c.TABLE_NAME = '%s'
    			ORDER BY
    				c.COLUMN_ID
    		)
    	UNION ALL
    		SELECT
    			')ROW FORMAT DELIMITED FIELDS TERMINATED BY ''\001'' TBLPROPERTIES(''creator''=''sunruzi'',''create_at''=''' || TO_CHAR (
    				SYSDATE,
    				'yyyy-MM-dd hh24:mi:ss'
    			) || ''');'
    		FROM
    			all_tab_comments T
    		WHERE
    			OWNER = 'SJGJ'AND table_name = '%s'
    	union all """ % (table_name[i],table_name[i],table_name[i])

在MySQL中生成hive建表语句: 

SELECT
    CONCAT('create table ',@tbl_name,'(')
UNION ALL
SELECT
    CONCAT(
        COLUMN_NAME,
        ' ',
        CASE
    WHEN DATA_TYPE in ('varchar','longtext','char','datetime','timestamp','varbinary','bit','mediumtext','set','longblob','text','blob','time','date') THEN
        'string'
    WHEN DATA_TYPE = 'decimal' THEN
        COLUMN_TYPE
   WHEN DATA_TYPE = 'float' THEN
        'double'
    ELSE 
        DATA_TYPE
    END -- 数据类型转换
    ,
    ' comment ',
    '\'',
    CASE
    WHEN COLUMN_COMMENT is NULL THEN
        COLUMN_NAME
    ELSE
        replace(COLUMN_COMMENT,';',',')
    END,
    '\','
    )
FROM
    information_schema. COLUMNS t1
WHERE
     t1.table_schema = @tbl_schema
 and t1.TABLE_NAME = @tbl_name
UNION ALL
SELECT
    concat(
        'etl_update string COMMENT \'数据同步时间\') ',
        'COMMENT \'',
        COALESCE (t2.TABLE_COMMENT ,@tbl_name),
        '\'
-- PARTITIONED BY (DATE STRING COMMENT \'日期分区\') -- 分区表取消注释
ROW FORMAT DELIMITED FIELDS TERMINATED BY \',\' STORED AS TEXTFILE;'
        )
    FROM
        information_schema. TABLES t2
    WHERE
        t2.table_schema = (@tbl_schema := 'XXX')
    and t2.table_name = (@tbl_name := 'XXX')

在Oracle中生成建表语句:

--根据oracle元数据生成hive建表语句
select 'create table bigdata_ods.' || &tb_name || ' ('
  from dual
union all
select col
  from (select t.column_name || case
                 when c.DATA_TYPE in ('CHAR',
                                      'NCHAR',
                                      'VARCHAR',
                                      'VARCHAR2',
                                      'NVARCHAR2',
                                      'DATE',
                                      'TIMESTAMP',
                                      'TIMESTAMP WITH TIME ZONE',
                                      'TIMESTAMP WITH LOCAL TIME ZONE',
                                      'INTERVAL YEAR TO MOTH',
                                      'INTERVAL DAY TO SECOND',
                                      'BLOB',
                                      'CLOB',
                                      'NCLOB',
                                      'BFILE',
                                      'RAW',
                                      'LONG RAW') then
                  ' STRING '
                 WHEN C.DATA_TYPE = 'INTEGER' THEN
                  ' BIGINT '
                 WHEN C.DATA_TYPE = 'NUMBER' THEN
                  (CASE
                    WHEN C.DATA_SCALE IS NOT NULL and c.DATA_SCALE<>0 THEN
                     ' DECIMAL(' || C.DATA_PRECISION || ',' || C.DATA_SCALE || ') '
                    WHEN C.DATA_PRECISION < 3 THEN
                     ' TINYINT '
                    WHEN C.DATA_PRECISION < 5 THEN
                     ' SMALLINT '
                    WHEN C.DATA_PRECISION < 10 THEN
                     ' INT '
                    ELSE
                     ' BIGINT '
                  END)
                 WHEN C.DATA_TYPE IN
                      ('BINARY_FLOAT', 'BINARY_DOUBLE', 'FLOAT') THEN
                  ' DOUBLE '
                 ELSE
                  ' STRING '
               END || 'comment ''' ||
               regexp_replace(t.comments,
                              '[' || chr(10) || chr(13) || chr(9) || chr(32) || ']',
                              '') || ''',' col
          from all_COL_COMMENTS t, all_TAB_COLUMNS c
         where c.column_name = t.column_name
           and c.owner = t.owner
           and c.TABLE_NAME = t.TABLE_NAME
           and c.owner = &schm_name
           and c.TABLE_NAME = &tb_name
         order by c.COLUMN_ID)
union all
select 'etl_time string comment ''etl时间'') comment ''' || t.comments ||
       ''' ROW FORMAT DELIMITED FIELDS TERMINATED BY ''\001'' TBLPROPERTIES(''creator''=''zhangfan'',''create_at''=''' ||
       to_char(sysdate, 'yyyy-MM-dd hh24:mi:ss') || ''');'
  from all_tab_comments t
 where owner = &schm_name
   and table_name = &tb_name;

原文地址:https://blog.youkuaiyun.com/fanlying/article/details/78683360

### 查看 HQL 或 SQL 表语的命令 在不同的数据库环境中,查看表语的方法有所不同。以下是针对HQL和SQL的具体方法。 #### 1. Hive 中查看表语Hive中,可以使用 `SHOW CREATE TABLE` 命令来查看已创表的表语。该命令会返回完整的DDL语,包括字段定义、分区信息、存储格式等内容[^3]。 ```sql SHOW CREATE TABLE 表名; ``` 此外,还可以通过 `DESC FORMATTED` 来获取更详细的元数据信息,其中包括表类型(内部表或外部表)、位置、输入输出格式等。 ```sql DESC FORMATTED 表名; ``` #### 2. MySQL 中查看表语MySQL中,可以直接使用 `SHOW CREATE TABLE` 命令来查看某个表的表语。这将显示原始的DDL语,便于复制或迁移[^4]。 ```sql SHOW CREATE TABLE 表名; ``` 如果需要批量导出多个表的表语,可以通过查询系统表 `information_schema.tables` 和 `information_schema.columns` 获取相关信息并拼接成最终的结果[^4]。 #### 3. Oracle 中查看表语 Oracle 并未提供直接类似于 `SHOW CREATE TABLE` 的功能,但可以通过查询数据字典视图 `USER_TAB_COLUMNS` 和 `ALL_TAB_COLUMNS` 构造相应的表语[^1]。例如: ```sql SELECT DBMS_METADATA.GET_DDL('TABLE', '表名') FROM DUAL; ``` 这种方法能够动态生成指定表的完整DDL语,适用于复杂场景下的逆向工程需求。 #### 4. SQL Server 中查看表语 对于SQL Server而言,除了手动编写外,还存在一种自动化方式——借助系统存储过程 `sp_help` 或者函数 `OBJECT_DEFINITION()` 提取目标对象的定义脚本[^2]。典型用法如下所示: ```sql EXEC sp_helptext '表名'; -- 或者 SELECT OBJECT_DEFINITION(OBJECT_ID('表名')) AS Create_Table_Script; ``` 这些工具可以帮助开发者快速定位所需内容而不必重新设计整个流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值