inceptor改字节串长度就是要在导入函数之前对文件作出修改 。
最近遇到一个导数需求,需要把inceptor中的数据按照每个字段定长(指定字节数)导出成文本文件 。思路如下:1)到处inceptor表到hdfs,这个过程 , 主要处理字段长度,补位,去小数点,规范行分隔符和切分文件2)取hdfs文件到本地,这个过程,主要处理文件名称的规范化,增加首行字段名,及获取记录数样例脚本
#!/bin/sh
#说明#1)脚本需要在能执行beeline和hadoop命令的机器上执行#2)部分用户执行beeline和hadoop命令时可能会找不到命令,请配置好环境变量,或者使用命令的绝对路径
导出数据到hdfs##执行脚本前提前建好导出数据的中间表#–如果需要指定换行(\n) 、回车(\r)为分隔符,则建表语句如下 。这里注意 , windows的行分隔符是 \r\n , linux 下默认是\n#create table test(aa string);#ROW FORMAT DELIMITED#LINES TERMINATED BY ‘\r\n’;
#连接inceptor
v_conn_ipt=“beeline -u jdbc:hive2://tdh4:10000/tpcds_orc_2”#指定导出的文件个数v_file_num=“set mapred.reduce.tasks=5;”
##每次执行前需要清空临时表v_clean_table=“truncate table test;”
#导出数据sql##注意,使用shell脚本封装时 , 这里是 四个反斜杠 ‘\\’ ,直接在inceptor 里直接执行这里只需要两个反斜杠 ‘\’v_load_string=“insert into testselect lpad(s_store_sk,5,‘0’)||-- 数字左补0,右对齐rpad(s_store_name,8,’ ‘)|| – 字符右补空格,左对齐regexp_replace(to_char(trunc(s_tax_precentage,2),‘0.00’),’\\.’,’’) as aa --数值型,去掉小数点,trunc直接截取合适的小数,to_char 格式化,replace去掉小数点from store distribute by rand();”
##执行导出语句把需要导出的文件写到hdfs
${v_conn_ipt} -e “${v_file_num} ${v_clean_table} ${v_load_string}”
数据导出到本地并添加表头行数等信息#文件导出路径v_file_path="/inceptorsql1/user/hive/warehouse/tpcds_orc_2.db/hive/test"v_files=hadoop fs -ls ${v_file_path}|awk '{ print $8 }'#文件导出的本地路径v_target_path=/root/xwz/
j=0for i in $v_filesdoecho ${i}#根据接口规范定义文件名 , 逻辑自行补充v_new_file_name=“xxx_xxx_${j}.TXT”echo “${v_new_file_name}”#把字段名写入文件第一行echo “s_store_sk|s_store_name|s_tax_precentage”>${v_target_path}${v_new_file_name}#导出hdfs文件到本地hadoop fs -cat ${i}>>${v_new_file_name}#如果需要获取每个文件的记录数使用如下命令v_count=hadoop fs -cat ${i}|wc -lecho “文件${v_new_file_name}的记录数为:${v_count}”j=expr ${j} + 1
done
遇到的问题中文及rapd 补位问题
【informix修改字段长度 - 经验总结 www.jingyanzongjie.com】
在inceptor中 , rpad 计算的是字符数 , 不是字节数,而Oracle的rpad是计算的字节数 。此时当出现中文时,Oracle会把一个中文当两个字节算 rpad(f1,12,’ ‘) 当f1为 “中国”Oracle会在后面补充8个空格,字节数为12 。inceptor会把一个中文当两个字节算 rpad(f1,12,’ ‘) 当f1为 “中国” f1,算两个字符,Oracle会在后面补充10个空格 , 此时实际字节数就超过了12了 。处理方式因为inceptor一个中文字符是3或4个字节,使用rpad按字符个数补的话,只会多补 , 不会少,使用substrb 函数对 inceptor 中rpad多补的字节数直接截断,substrb函数是切割指定的字节长度比如对中文字段f1要指定定长12字节,可以使用 substrb(rpad(f1,12,’ '),1,12)