在用Python编写hive
UDF
时,如何处理NULL
输入值?。
重现该错误的示例设置:
配置单元表:
CREATE external table udfTest(
fname STRING,
age INT
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '<location>';
input.txt:
abc 1
efg 2
3 //missing fname
hij //missing age
加载数据:
LOAD DATA INPATH '/tmp/input.txt' INTO TABLE udfTest;
Python UDF将年龄增加1:
import sys
import datetime
for line in sys.stdin:
fname, age = line.strip('\n').split('\t')
fname = fname.upper() if (fname is not None and fname != '') else 'dummy'
age = int(age) if (age is not None and age.strip() != 'NULL') else -1
print '\t'.join(map(str, [fname, age]))
加载UDF并在配置单元中调用它:
add FILE /tmp/example.py
SELECT TRANSFORM(fname, age) USING 'python /tmp/example.py' AS (fname, age) FROM udfTest;
错误,我得到:
已结束的作业=作业_1560326504017_73073出错,作业期间发生错误, 正在获取调试信息...正在检查任务ID: 任务中的task_1560326504017_73073_m_000000(及更多) job_1560326504017_73073
失败最多的任务(4): -----任务ID:task_1560326504017_73073_m_000000
URL:
-----此任务的诊断消息:错误:java.lang.RuntimeException:Hive运行时在关闭运算符时出错 在 org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:217) 在org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:61)处 org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:459)在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)在 org.apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.java:164)在 java.security.AccessController.doPrivileged(本机方法),位于 javax.security.auth.Subject.doAs(Subject.java:422)在 org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1924) 在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:158)导致 创建人:org.apache.hadoop.hive.ql.metadata.HiveException:[错误20003]: 尝试关闭运行您的操作员的操作时发生错误 自定义脚本。在 org.apache.hadoop.hive.ql.exec.ScriptOperator.close(ScriptOperator.java:572) 在org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610) 在org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610) 在org.apache.hadoop.hive.ql.exec.Operator.close(Operator.java:610) 在 org.apache.hadoop.hive.ql.exec.mr.ExecMapper.close(ExecMapper.java:199) ...另外8个
FAILED:执行错误,返回代码20003 org.apache.hadoop.hive.ql.exec.mr.MapRedTask。发生错误时 试图关闭运行自定义脚本的操作员。
已编辑
:select * from udfTest;
abc 1
efg 2
3
hij NULL
答案 0 :(得分:1)
“默认情况下,列将被转换为STRING并由TAB分隔,然后再馈送到用户脚本;类似地,所有NULL值都将转换为文字字符串\ N,以便将NULL值与空字符串区分开。”更多详细信息here。因此,您需要检查您的列是否为'\N'
。