Hive-在Python UDF中处理NULL输入值

时间:2019-06-19 03:17:29

标签: python hive user-defined-functions

在用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

1 个答案:

答案 0 :(得分:1)

“默认情况下,列将被转换为STRING并由TAB分隔,然后再馈送到用户脚本;类似地,所有NULL值都将转换为文字字符串\ N,以便将NULL值与空字符串区分开。”更多详细信息here。因此,您需要检查您的列是否为'\N'