Hive - обработка значений NULL в Python UDF - PullRequest
0 голосов
/ 19 июня 2019

во время записи 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

1 Ответ

1 голос
/ 19 июня 2019

"По умолчанию столбцы будут преобразованы в STRING и разделены TAB перед подачей в пользовательский скрипт; аналогично, все значения NULL будут преобразованы в буквальную строку \ N, чтобы отличать значения NULL от пустых строк." Подробнее здесь . Следовательно, вам нужно проверить, является ли ваш столбец '\N' или нет.

...