python根据excel生成Hive ddl sql 和 MySQL 表语句

Excel:

中文表名称企业基本信息
英文表名称enterprise_base_info
备注说明    
接口单元文件命名接口数据文件名   
校验文件名   
字段序号逻辑名称物理名称字段类型是否必填
1企业名称enterprise_namevarchar(1000) 
2营业执照类型license_typevarchar(20)
3证照编号license_novarchar(1000) 

 

 

 

 

 

 

 

 

 

 

生成的DDL:

hive :
CREATE TABLE IF NOT EXISTS enterprise_base_info(
enterprise_name                STRING    COMMENT'企业名称'
,license_type                  STRING    COMMENT'营业执照类型'
,license_no                    STRING    COMMENT'证照编号'

) 
 ROW FORMAT DELIMIETED 
 FIELDS TERMINATED BY '\t' 
 STORED AS TEXTFILE;

mysql :

CREATE TABLE IF NOT EXISTS td_yj_xx_enterprise_base_info_d(
id                             INT NOT NULL AUTO_INCREMENT   COMMENT'ID'
,license_type                  varchar(64)                        COMMENT'营业执照类型'
,license_no                    varchar(128)    NOT NULL           COMMENT'证照编号'
,industry                      varchar(256)                       COMMENT'所有行业'
,PRIMARY KEY (id) 
 ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='企业基本信息';

python代码:

   ps : 没有做过多的格式校验,所以对excel的中英文格式要求严格。

import os
import sys
import re
import xlrd
# 检验是否全是英文字符


def hiveddl(excel_name):
    # 打开excel
    data = xlrd.open_workbook(excel_name)
    # 列出所有sheet
    list_sheet = data.sheet_names()
    filename = 'HiveDDL.txt'
    with open(filename, 'w', encoding="utf-8") as f:  # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
        for sheet in list_sheet:
            # 因为表的字段信息都是放在01、02这种sheet的,所以正则匹配
            patten = "\d+"
            flag = re.match(patten, sheet)
            if flag:
                sheet_index = data.sheet_by_name(sheet)
                row_cnt = sheet_index.nrows
                # 中文表名
                table_ch_name = sheet_index.cell(0, 1).value
                # 英文表名
                table_eg_name = sheet_index.cell(1, 1).value
                # 中文字段
                ch_fields = sheet_index.col_values(1, 6)
                # print(ch_fields)
                # 字段行数
                field_count = len(ch_fields)

                sql = "CREATE TABLE IF NOT EXISTS " + table_eg_name + "(\n"
                str_colums = '{:<31}'.format(sheet_index.cell(6, 2).value) + '{:<10}'.format('STRING') \
                             + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format(sheet_index.cell(6, 1).value) + '\'\n'
                # print(str_colums)
                # 因为字段是从第7行开始,所以从第7行开始循环
                for i in range(6, field_count):

                    str_colums += ',' + '{:<30}'.format(sheet_index.cell(i + 1, 2).value) + '{:<10}'.format('STRING') \
                                  + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format(sheet_index.cell(i + 1, 1).value) + '\'\n'
                sql += str_colums

                sql += ') \n COMMENT \'' \
                       + table_ch_name \
                       + '\'\nPARTITIONED BY(pday STRING)' \
                         '\nROW FORMAT DELIMIETED ' \
                         '\n  FIELDS TERMINATED BY \'\\t\' ' \
                         '\nSTORED AS INPUTFORMAT' \
                         '\n \'org.apache.hadoop.mapred.TextInputFormat\'' \
                         '\nOUTPUTFORMAT' \
                         '\n \'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat\';\n'
                print(sql)

                f.write(sql)
    f.close()


def mysqlddl(excel_name):
    # 打开excel
    data = xlrd.open_workbook(excel_name)
    # 列出所有sheet
    list_sheet = data.sheet_names()
    filename = 'MysqlDDL.txt'
    with open(filename, 'w', encoding="utf-8") as f:  # 如果filename不存在会自动创建, 'w'表示写数据,写之前会清空文件中的原有数据!
        for sheet in list_sheet:
            # 因为表的字段信息都是放在01、02这种sheet的,所以正则匹配
            patten = "\d+"
            flag = re.match(patten, sheet)
            if flag:
                sheet_index = data.sheet_by_name(sheet)
                row_cnt = sheet_index.nrows

                # 英文表名
                table_eg_name = sheet_index.cell(1, 1).value
                # 中文字段
                ch_fields = sheet_index.col_values(1, 6)
                # print(ch_fields)
                # 字段行数
                field_count = len(ch_fields)

                sql = "CREATE TABLE IF NOT EXISTS " + table_eg_name + "(\n"
                str_colums = '{:<31}'.format('id') + '{:<30}'.format('INT NOT NULL AUTO_INCREMENT') \
                             + '{:<}'.format('COMMENT\'') + \
                             '{:<}'.format('ID') + '\'\n'
                # print(str_colums)
                # 因为字段是从第7行开始,所以从第7行开始循环
                for i in range(6, field_count):
                    is_blank_cell = sheet_index.cell(i + 1, 4).value
                    is_blank = lambda cell: 'NOT NULL' if is_blank_cell == '是' else ""
                    str_colums += ',' + '{:<30}'.format(sheet_index.cell(i + 1, 2).value) \
                                  + '{:<20}'.format(sheet_index.cell(i + 1, 3).value) \
                                  + '{:<15}'.format(is_blank(is_blank_cell)) \
                                  + '{:<}'.format('COMMENT\'') \
                                  + '{:<}'.format(sheet_index.cell(i + 1, 1).value) + '\'\n'
                sql += str_colums

                sql += ',PRIMARY KEY (id) \n ' \
                    ') ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT=\'' + format(sheet_index.cell(0, 1).value) + '\';\n'
                print(sql)

                f.write(sql)
    f.close()

if __name__ == '__main__':
    excel_name = "C:\\Users\\yangxiaofeng\\Desktop\\明细层v0.1_20200415.xls"
    hiveddl(excel_name)
    mysqlddl(excel_name)

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值