添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

遇到一个场景,要 根据oracle表结构创建hive表
本来想写一个根据oracle信息和表名自动在hive中创建表的脚本。如果在集群运行,python操作oracle的cx_Oracle在集群的每个结点都需要安装,时间紧急,干活要紧,先凑合写个脚本本地用着吧

# -*- coding=utf8 -*-
class GetHiveDDLFromOracleMeta:
    def get_oralce_2_hive_datatype_map(self):
        type_map = {"INTEGER": "double",
                    "NUMBER": "double",
                    "NUMBER(10)": "bigint",
                    "NUMBER(11)": "bigint",
                    "NUMBER(12)": "bigint",
                    "NUMBER(13)": "bigint",
                    "NUMBER(14)": "bigint",
                    "NUMBER(15)": "bigint",
                    "NUMBER(16)": "bigint",
                    "NUMBER(17)": "bigint",
                    "NUMBER(18)": "bigint",
                    "NUMBER(5)": "int",
                    "NUMBER(6)": "int",
                    "NUMBER(7)": "int",
                    "NUMBER(8)": "int",
                    "NUMBER(9)": "int",
                    "NUMBER(2)": "smallint",
                    "NUMBER(3)": "smallint",
                    "NUMBER(4)": "smallint",
                    "NUMBER(P,S)": "decimal",
                    "NUMBER(1)": "tinyint",
                    "FLOAT": "double",
                    "BINARY_FLOAT": "double",
                    "BINARY_DOUBLE": "double",
                    "DATE": "timestamp",
                    "TIMESTAMP(1)": "timestamp",
                    "TIMESTAMP(2)": "timestamp",
                    "TIMESTAMP(3)": "timestamp",
                    "TIMESTAMP(4)": "timestamp",
                    "TIMESTAMP(5)": "timestamp",
                    "TIMESTAMP(6)": "timestamp",
                    "CHAR": "string",
                    "NCHAR": "string",
                    "NVARCHAR2": "string",
                    "VARCHAR2": "string",
                    "NVARCHAR": "string",
                    "BLOB": "", "BFILE": "", "NCLOB": "","CLOB": "string", "ROWID": "", "UROWID": "", "TIMESTAMP with time zone": "",
                    "TIMESTAMP with local time zone": "", "ANYDATA": "", "VARRAY": "", "NESTEDTAB": "", "Object": ""
            , "REF": "", "RAW": ""}
        return type_map
    def split_oracl_meta(self, oracle_meta):
        name_types = []
        for name_type in oracle_meta.split(","):
            column_name = name_type.split(" ")[0]
            column_type = name_type.split(" ")[1]
            name_types.append((column_name, column_type))
        return name_types
    def transfrom_from_oracle_to_hive(self, oracle_meta_maps):
        oracle_hive_maps = self.get_oralce_2_hive_datatype_map()
        hive_name_type_maps = []
        for name_type in oracle_meta_maps:
            column_name = name_type[0]
            oracle_type = name_type[1]
            hive_type = oracle_hive_maps[oracle_type]
            if hive_type:
                print(oracle_hive_maps[oracle_type])
                hive_name_type_maps.append((column_name, hive_type))
            else:
                raise Exception(" ERROR!!!  no map column and type is " + str(name_type))
        return hive_name_type_maps
    def get_dml_from_hive_name_type_maps(self, hive_name_type_maps, hive_table_name):
        dml_sql_prefix = "create external table " + hive_table_name + " ("
        dml_sql_middle = ""
        for name_type in hive_name_type_maps:
            column_name = name_type[0]
            column_type = name_type[1]
            dml_sql_middle = dml_sql_middle + column_name + " " + column_type + ", "
        dml_sql_middle = dml_sql_middle[0:len(dml_sql_middle)-2]
        dml_sql_suffix = ") " \
                         " row format delimited fields terminated by '\t' stored as textfile ;"
        sql = dml_sql_prefix + dml_sql_middle + dml_sql_suffix
        return sql
    def create_hive_table_dml_by_oracle_meta(self, oracle_meta, hive_table_name):
        oracle_name_types = self.split_oracl_meta(oracle_meta)
        hive_name_types = self.transfrom_from_oracle_to_hive(oracle_name_types)
        hive_table_dml_sql = self.get_dml_from_hive_name_type_maps(hive_name_types,hive_table_name)
        return hive_table_dml_sql
if __name__ == "__main__":
    this_obj = GetHiveDDLFromOracleMeta()
    oracle_meta = "BIAOZHIPAIDIANNAOBIANHAO NUMBER,BIAOZHIPAIFUKAYOUXIAOQICONG TIMESTAMP(6),BIAOZHIPAIFUKAYOUXIAOQIZHI TIMESTAMP(6),BIAOZHIPAIHAOMA VARCHAR2,BIAOZHIPAILEIXING VARCHAR2,CHELIANGDIANNAOBIANHAO NUMBER,CHELIANGTUICHURIQI TIMESTAMP(6),CHEXINGXIANZHI VARCHAR2,CUSTOM_OPER_TYPE VARCHAR2,CUSTOM_UPDATE_TIME TIMESTAMP(6),DAIYONGKAYOUXIAOQICONG TIMESTAMP(6),DAIYONGKAYOUXIAOQIZHI TIMESTAMP(6),FUKAHAO VARCHAR2,GUANLIJIBIE VARCHAR2,JINGYINGQIXIAN TIMESTAMP(6),JINGYQUANDANWEIDIANNAOBIANHAO NUMBER,NITOURUCHELIANGRIQI TIMESTAMP(6),PIWENHAO VARCHAR2,PIZHUNJIGUAN VARCHAR2,PIZHUNSHIJIAN TIMESTAMP(6),PM_PRIMARYKEY NUMBER,QIDIANDI VARCHAR2,SHENQINGRIQI TIMESTAMP(6),SHIFOUYIFAPAI VARCHAR2,SHIYONGDANWEIDIANNAOBIANHAO NUMBER,SHOUCITOURUSHIJIAN TIMESTAMP(6),SHUJUZHUANGTAI VARCHAR2,SYS_XINZENGREN VARCHAR2,SYS_XINZENGSHIJIAN TIMESTAMP(6),SYS_ZUIJINXIUGAIREN VARCHAR2,SYS_ZUIJINXIUGAISHIJIAN TIMESTAMP(6),XIAQUSHENG VARCHAR2,XIAQUSHI VARCHAR2,XIAQUXIAN VARCHAR2,XIAQUZHEN VARCHAR2,XUKERIQI TIMESTAMP(6),YUANCHEPAIHAO VARCHAR2,ZHIBIAODIANNAOBIANHAO NUMBER,ZHIBIAOYOUXIAORIQI TIMESTAMP(6),ZHIBIAOZHONGLEI VARCHAR2,ZHUANGBEITIAOJIAN VARCHAR2,ZHUANGTAI VARCHAR2,ZUIDICHELIANGJISHUDENGJI VARCHAR2,ZUIDICHELIANGZHUANGBEIDENGJI VARCHAR2"
    hive_table_name = "ST_DLYS_KEYUNBAOCHEXIANLU"
    results = this_obj.create_hive_table_dml_by_oracle_meta(oracle_meta, hive_table_name)
    print(type(results))
    print(results)

1.根据自己需求调整get_oralce_2_hive_datatype_map方法中的类型映射

2.在能连oracle的工具中,例如plsql,navicat,dbeaver等工具,连接到oracle库,执行下面的sql

注意:TABLE_NAME请改成创建hive表依据的oracle表名

select Listagg(concat(concat(A.COLUMN_NAME,' '),A.DATA_TYPE), ',') WITHIN GROUP(ORDER BY column_name)
from user_tab_columns A
where table_name = upper('TABLE_NAME');

查询结果类似这样

BIAOZHIPAIDIANNAOBIANHAO NUMBER,BIAOZHIPAIFUKAYOUXIAOQICONG TIMESTAMP(6),BIAOZHIPAIFUKAYOUXIAOQIZHI TIMESTAMP(6),BIAOZHIPAIHAOMA VARCHAR2,BIAOZHIPAILEIXING VARCHAR2,CHELIANGDIANNAOBIANHAO NUMBER,CHELIANGTUICHURIQI TIMESTAMP(6),CHEXINGXIANZHI VARCHAR2,CUSTOM_OPER_TYPE VARCHAR2,CUSTOM_UPDATE_TIME TIMESTAMP(6),DAIYONGKAYOUXIAOQICONG TIMESTAMP(6),DAIYONGKAYOUXIAOQIZHI TIMESTAMP(6),FUKAHAO VARCHAR2,GUANLIJIBIE VARCHAR2,JINGYINGQIXIAN TIMESTAMP(6),JINGYQUANDANWEIDIANNAOBIANHAO NUMBER,NITOURUCHELIANGRIQI TIMESTAMP(6),PIWENHAO VARCHAR2,PIZHUNJIGUAN VARCHAR2,PIZHUNSHIJIAN TIMESTAMP(6),PM_PRIMARYKEY NUMBER,QIDIANDI VARCHAR2,SHENQINGRIQI TIMESTAMP(6),SHIFOUYIFAPAI VARCHAR2,SHIYONGDANWEIDIANNAOBIANHAO NUMBER,SHOUCITOURUSHIJIAN TIMESTAMP(6),SHUJUZHUANGTAI VARCHAR2,SYS_XINZENGREN VARCHAR2,SYS_XINZENGSHIJIAN TIMESTAMP(6),SYS_ZUIJINXIUGAIREN VARCHAR2,SYS_ZUIJINXIUGAISHIJIAN TIMESTAMP(6),XIAQUSHENG VARCHAR2,XIAQUSHI VARCHAR2,XIAQUXIAN VARCHAR2,XIAQUZHEN VARCHAR2,XUKERIQI TIMESTAMP(6),YUANCHEPAIHAO VARCHAR2,ZHIBIAODIANNAOBIANHAO NUMBER,ZHIBIAOYOUXIAORIQI TIMESTAMP(6),ZHIBIAOZHONGLEI VARCHAR2,ZHUANGBEITIAOJIAN VARCHAR2,ZHUANGTAI VARCHAR2,ZUIDICHELIANGJISHUDENGJI VARCHAR2,ZUIDICHELIANGZHUANGBEIDENGJI VARCHAR2

复制查询结果

3.修改main函数里的参数

  1. 用上面复制的字段名和类型拼接成的字符串替换main函数里的参数oracle_meta=右侧的字符串
  2. 修改参数hive_table_name=右侧的表名为想要创建的hive表名
  3. (以py文件名是GetHiveDDLFromOracleMeta为例)在pycharm里run或者打开cmd输入$PYTHON_HOME/python GetHiveDDLFromOracleMeta.py
  4. pycharm控制台或者cmd输出的create语句即为所需的hive建表语句了

4.优化(TODO)

后面有时间会把复制sql查询结果这一步用查询oracle的方法替代。hive建表语句也不需要粘贴出来自己运行,而是直接自动创建。

一、问题遇到一个场景,要根据oracle表结构创建hive表。本来想写一个根据oracle信息和表名自动在hive中创建表的脚本。如果在集群运行,python操作oracle的cx_Oracle在集群的每个结点都需要安装,时间紧急,干活要紧,先凑合写个脚本本地用着吧二、解决# -*- coding=utf8 -*-class GetHiveDDLFromOracleMeta: def get_oralce_2_hive_datatype_map(self): type_m 本文主要给大家介绍了关于Mysql元数据生成Hive建表语句注释脚本的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 最近在将数据从Mysql 等其他关系型数据库 抽取到Hive 表中时,需要同步mysql表中的注释,以下脚本可以生成hive表字段注释修改语句。 注:其他关系型数据库如:oracle 可以通过相同的思路,读取元数据,修改脚本语法实现。 在mysql元数据库:information_schema 中执行以下语句 SELECT CONCAT('alter table ', TABLE_NAME, ' CHANGE COLUMN ', COL
在使用cx_Oracle连接正式Oracle的时候出现无法连接的问题,通过咨询DBA同事发现这台DB采用的是rac集群的方式搭建,因此连接的时候就应该使用另外的方式。 import cx_Oracle tns = cx_Oracle.makedsn('0.0.0.0', '1521', service_name = 'racdb') conn = cx_Oracle.connect('user',
首先,你需要安装对应的数据库驱动。对于 MySQL 和 MariaDB,你可以使用 PyMySQL 驱动;对于 PostgreSQL,你可以使用 psycopg2 驱动;对于 Oracle,你可以使用 cx_Oracle 驱动;对于 Kingbase,你可以使用 pyodbc 驱动;对于 Hive,你可以使用 PyHive 驱动。 具体的安装方法可以参考各自的文档,这里不再赘述。 然后,你可以使用...
4 import java.io.FileOutputStream; 5 import java.sql.Connection; 6 import java.sql.DriverManager; 7 import java.sql.ResultSet; 8 import java.sql.SQLException; 9 import java.sql.Statement; 10 import java...
oraclehive中的数据类型存在差异,在oracle集成数据到hive中这样的场景下,我们希望在hive中的数据是贴源的,所以在hive中希望创建和oracle结构一致的表。 oraclehive数据类型映射参考如下:
这里写目录标题1 是什么2 为什么3 开源量化交易项目中国德国美国4 商业版交易平台5 量化界大佬3.1 先驱者3.2 其他知名人物 1 是什么 借助数学方法,利用计算机技术进行交易的证券投资技术。 想到一种策略。例如股价大于5日均价则卖出,股价小于5日均价则买入。 把策略细化成可操作的步骤 用代码实现策略的细化操作步骤 检验策略效果 用历史数据回测。在历史数据上模拟执行该策略,看经过给定的一段时间之后的收益情况如何。 模拟交易。用真实市场数据来模拟执行策略,看经过一段时间之后的收益情况如何。
研究这个的目的是项目很多,每个项目都需要安装一些环境,所以想搞一些自动化配置提高效率 一、Ansible 简介 基于python开发的自动化运维工具,可以批量系统配置、批量程序部署、批量运行命令 有两种安装方式,任选其一即可: 1.用python 包管理工具 pip 安装 2.用操作系统自带的包管理工具(yum、apt)安装 系统版本: username@test:~# lsb_release -a No LSB modules are available. Distributor ID: Ubu
要读取文件并生成Hive建表语句,可以按照以下步骤进行: 1. 首先,需要确定文件的格式和字段的分隔符。一般来说,Hive支持多种文件格式,如文本文件(CSV、TSV等)、Parquet、ORC等。同时,还需要知道字段的分隔符,通常是逗号、制表符或者其他自定义符号。 2. 使用Hive的LOAD DATA语句将文件加载到Hive表中。LOAD DATA语句用于将外部文件加载到Hive表中,并自动将文件的数据映射到Hive表的字段中。可以指定文件的路径、表名以及字段的分割符。 3. 查看加载的数据是否正确。可以使用Hive的SELECT语句从加载的表中查询数据,以确保数据加载正确。 4. 生成建表语句。可以通过Hive自带的工具或者编写自定义脚本来生成建表语句。如果使用Hive自带的工具,可以使用Hive的DESCRIBE表命令来查看表的元数据信息,并将元数据信息用于生成建表语句。如果使用自定义脚本,可以读取加载的表的元数据信息,然后根据元数据信息来生成建表语句。 5. 根据字段的类型和属性生成建表语句。根据表的字段类型和属性(如VARCHAR、INT、DECIMAL等)以及字段的分隔符,可以生成对应的建表语句。可以使用Hive的CREATE TABLE语句来创建表,并指定表的名称、字段列表、数据类型和数据分隔符等信息。 总结起来,要读取文件并生成Hive建表语句,首先加载文件到Hive表中,然后根据加载的数据和字段属性生成建表语句。最后,使用生成建表语句创建Hive表。
CSDN-Ada助手: 非常感谢您分享关于康奈尔笔记法的博客,这篇博客很有启发性,让我对笔记方法有了更深入的了解。我觉得接下来您可以写一篇关于如何利用笔记法提高学习效率的博客,这样的技术文章对其他用户来说也会很有帮助。相信您的经验和心得分享会吸引更多读者的关注和学习。期待您的下一篇博客。 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。