во время записи hive
UDF
с на Python, как обрабатывать входные значения 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;
Ошибка, я получаю:
Завершено задание = job_1560326504017_73073 с ошибками Ошибка во время задания,
получение отладочной информации ... Проверка идентификатора задачи:
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) вызвано
by: 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. Произошла ошибка, когда
пытаясь закрыть Operator, выполняющий ваш собственный скрипт.
РЕДАКТИРОВАНИЕ:
select * from udfTest;
abc 1
efg 2
3
hij NULL