Laxcus大数据技术 2020-05-30
为了将数据仓库设计过程中excel中设计的物理模型高效转换成标准的Hive建表语句,我用 python开发了如下的工具
createDdlSql.py:
功能:实现将excel中的物理模型转换成建表语句文件
输入:当前目录文件名为“数据模型.xls”或“数据模型.xlsx”的excel,模型结尾必须要有数据检验两行
输出:当前目录建表语句文件
python
‘‘‘
--***************************************************************
--*脚本名称: createSqlDdl
--*功能: excel模型-》Ddl_表名.sql
--*输入数据:数据模型.xls or 数据模型.xlsx
--*输出数据:Ddl_表名.sql
--*作者: guominghuang
--*更新时间: 2020-5-15 15:00
--***************************************************************
--*版本控制:版本号 提交人 提交日期 提交内容
-- V1.0 guominghuang 2020-5-15 新增上线
‘‘‘
import os
import numpy as np
import pandas as pd
from pandas import DataFrame
#HDFS数据仓库路径
HDFS_DIR = "‘hdfs://dse.host.hz.io:8020/jkd_dw/"
‘‘‘
转换函数
‘‘‘
def transform(file):
excel = pd.read_excel(file,None)
sheetNames = excel.keys()
for sheetName in sheetNames:
if sheetName.startswith("ods") or sheetName.startswith("dwd") or sheetName.startswith("dws") or sheetName.startswith("dws") or sheetName.startswith("ads") or sheetName.startswith("dim"):
#if sheetName.startswith("ods_tg_edu_b"):
df= DataFrame(pd.read_excel(file,sheetName))
#获取表名和表注释
tableName = df.columns.values[1]
tableComment = df.iloc[0][1]
#删除第一行和第二行无用数据
df.drop([0,1],inplace=True)
#删除空行
df.dropna(axis=‘index‘, how=‘all‘,inplace=True)
#取出分区字段行
partitionRow = np.array(df[-3:-2]).tolist()[0]
# 获取分区字段名
partitionFieldName = partitionRow[0]
# 获取分区字段类型
partitionFieldType = partitionRow[1]
# 获取分区字段注释
#partitionFieldComment = partitionRow[columns[2]]
#判断是否存在分区字段"partition_date"
if partitionFieldName != "partition_date":
# 删除无用数据校验2行,获得所有字段
dfSub3row = df[:-2]
else:
# 删除无用数据校验2行和分区字段1行,获得所有字段
dfSub3row = df[:-3]
#获取列名
columns = df.columns.values
#获取字段名
fieldName = dfSub3row[columns[0]]
#获取字段类型
fieldType = dfSub3row[columns[1]]
#获取字段注释
fieldComment = dfSub3row[columns[2]]
sql = "CREATE EXTERNAL TABLE "+ tableName + " (\n"
#计数保证‘,‘格式
count = 0
# fieldName是Series类型,需要按key取值
#遍历所有字段
for i in fieldName.keys():
if count == 0:
sql += " " + fieldName[i] + " " 75 + fieldType[i] + " COMMENT \‘" + fieldComment[i] + "\‘" + "\n"
else:
sql += " " + ‘,‘+ fieldName[i] + " " 78 + fieldType[i] + " COMMENT \‘" + fieldComment[i] + "\‘" + "\n"
count += 1
#判断是否存在分区字段"partition_date"
if partitionFieldName != "partition_date":
sql = sql + ")" + "\n" + "COMMENT ‘" + tableComment + "‘" + "\n" + "STORED AS PARQUET" + "\n" + "LOCATION" + ‘\n‘ 85 + HDFS_DIR + tableName[0:3] + "/" + tableName + "‘\n" + ";"
else:
sql = sql + ")" + "\n" + "COMMENT ‘" + tableComment + "‘" + " PARTITIONED BY(" + "\n" + partitionFieldName 88 + " " + partitionFieldType + ")" + "\n" + "STORED AS PARQUET" + "\n" + "LOCATION" + ‘\n‘ 89 + HDFS_DIR + tableName[0:3] + "/" + tableName + "‘\n" + ";"
# print(sql)
#创建Ddl文件
fileName = "Ddl_" + sheetName + ".sql"
#创建文件对象,覆盖写方式
fileObject = open(fileName,‘w‘)
try:
#创建文件
fileObject.write(sql)
finally:
#关闭文件对象
fileObject.close()
#主函数
if __name__ == ‘__main__‘:
#获取当前目录下数据模型文件
file_list = os.listdir(‘.‘)
for file in file_list:
if(file == ‘数据模型.xls‘) or (file == ‘数据模型.xlsx‘):
#生成建表文件
transform(file)输入模型excel范例

输出:

CREATE EXTERNAL TABLE ods_ykt_base_term_yy_f (
ecode string COMMENT ‘企业代码‘
,term_id int COMMENT ‘终端编号‘
,term_name string COMMENT ‘终端名称‘
,term_addr string COMMENT ‘终端地址,如果是以太网设备就为实际的IP地址‘
,dpt_code string COMMENT ‘商户部门代码,不可重复‘
,account_code int COMMENT ‘一卡通系统的科目代码‘
,dscrp string COMMENT ‘一卡通系统的科目描述‘
,isuse int COMMENT ‘是否使用‘
,extended_term_addr int COMMENT ‘扩展终端编号‘
,pos_code string COMMENT ‘设备运营唯一编号‘
,type_id int COMMENT ‘终端类型编号‘
,sam_card_no bigint COMMENT ‘卡号,没有sam卡为0‘
,communication_mode int COMMENT ‘通讯方式‘
,all_dpt_code string COMMENT ‘终端所属部门编号‘
,update_flag string COMMENT ‘更新状态‘
,update_time string COMMENT ‘更新时间‘
,down_time string COMMENT ‘读取时间‘
,ver string COMMENT ‘版本号‘
)
COMMENT ‘终端信息表‘ PARTITIONED BY(
partition_date string)
STORED AS PARQUET
LOCATION
‘hdfs://dse.host.hz.io:8020/jkd_dw/ods/ods_ykt_base_term_yy_f‘
;