hive SQL调用python脚本遇到的几个问题

sql调用python获取数据字段个数太多
源码:
for line in sys.stdin:
(tid, dp_id, customerno,...此处省略多个字段,共n个字段) = line.strip().split()

异常:

图1

原因:

根据测试,split分割数据以后获取n+m个数值,与预期的n个数值不对应,split默认以空格分割数据,而hive录入数据默认以制表符“\t”分割。

解决:

for line in sys.stdin:

(tid, dp_id, customerno,...此处省略多个字段,共n个字段) = line.strip().split(“\t”)
python print输出数据类型格式不准确
源码:
print "%s\t%s\t%s\t%s\t%d\t%f\t%s\t%g..." % (tid, dp_id, customerno, created, endtime, status, trade_from, type, pay_time, total_fee, ...)

异常:
图2

原因:
如上源码和问题1中的源码,括号内传入的数据都为string型。“%s”,“%f”,“%d”,“%g”是根据hive表中字段数据类型来定的。此处print输出数据至sql因为数据类型不匹配出现如上异常。

解决:
根据括号内的常数类型使用相应的输出类型,输出类型不是根据hive表字段数据类型来定,如上,括号内都是string类型,即所有输出使用“%s”。

sys.stdin输入python脚本中数据准确split后,字段个数不准确,问题类似于问题1
源码:
如问题1中源码。

异常:
图3

原因:
正常情况下,split后有41个字段数据,然而split后少于41个字段,经过测试,sys.stdin输入数据中,有字段有空值或者字段内容中含有\n \r \01等特殊字符,导致切割数据不准确。

解决:
构建表时加入:alter table_name set serdeproperties('serialization.null.format'='NULL');
sqoop脚本中加入:--hive-drop-import-delims
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值