Настройка MultiDelimiterSerDe в Amazon Hive - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать multidelimiter во вставке таблицы для задания улья в emr на amazon aws. Как объяснено в этой ссылке. Разделителем файла является «|».

https://cwiki.apache.org/confluence/display/Hive/MultiDelimitSerDe

Однако мне пришлось использовать ...

ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe'

Вместо документированных ...

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.MultiDelimitSerDe'

чтобы он не выдал мне эту ошибку.

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Cannot validate serde: org.apache.hadoop.hive.serde2.MultiDelimitSerDe

OK. Поэтому, когда я не получаю эту ошибку, добавляя .contrib, я получаю эту ошибку, вызванную: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassNotFoundException: Class org. apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe не найден

Status: Failed
Vertex failed, vertexName=Map 1, vertexId=vertex_1548264520414_0027_1_00, diagnostics=[Task failed, taskId=task_1548264520414_0027_1_00_000021, diagnostics=[TaskAttempt 0 failed, info=[Error: Error while running task ( failure ) : attempt_1548264520414_0027_1_00_000021_0:java.lang.RuntimeException: java.lang.RuntimeException: Map operator initialization failed
at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:211)
at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:168)
at org.apache.tez.runtime.LogicalIOProcessorRuntimeTask.run(LogicalIOProcessorRuntimeTask.java:370)
at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:73)
at org.apache.tez.runtime.task.TaskRunner2Callable$1.run(TaskRunner2Callable.java:61)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1840)
at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:61)
at org.apache.tez.runtime.task.TaskRunner2Callable.callInternal(TaskRunner2Callable.java:37)
at org.apache.tez.common.CallableWithNdc.call(CallableWithNdc.java:36)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.RuntimeException: Map operator initialization failed
at     org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.init(MapRecordProcessor.java:354)
at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:184)
... 14 more
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.ClassNotFoundException: Class org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe not found
at org.apache.hadoop.hive.ql.exec.MapOperator.getConvertedOI(MapOperator.java:328)
at org.apache.hadoop.hive.ql.exec.MapOperator.setChildren(MapOperator.java:420)
at org.apache.hadoop.hive.ql.exec.tez.MapRecordProcessor.init(MapRecordProcessor.java:286)
... 15 more

Итак, я читал, что вы должны добавить файл .jar.

https://community.hortonworks.com/questions/82189/hive-cannot-see-jar.html

И поэтому я попробовал все, чтобы заставить это работать. Он говорит, что добавляет его к пути к классам.

hive> add jar /usr/lib/hive/lib/hive-contrib-2.3.3-amzn-1.jar
> ;
Added [/usr/lib/hive/lib/hive-contrib-2.3.3-amzn-1.jar] to class path
Added resources: [/usr/lib/hive/lib/hive-contrib-2.3.3-amzn-1.jar]
hive> add jar /usr/lib/hive/lib/hive-contrib.jar
> ;
Added [/usr/lib/hive/lib/hive-contrib.jar] to class path
Added resources: [/usr/lib/hive/lib/hive-contrib.jar]
hive> exit;

Так что я не уверен, что делать. Он действует так, как будто файл .jar для hive-contrib отсутствует в пути к классам, несмотря на то, что я его добавил. Я также пытался бежать ...

export HADOOP_USER_CLASSPATH_FIRST=true

который находится здесь ...

Как включить банки в Hive (Amazon Hadoop env)

И это тоже не исправляет.

Как использовать свойство SerDe с несколькими ограничителями для работы с кустами в aws?

Спасибо.

1 Ответ

0 голосов
/ 25 января 2019

Я не смог заставить MultiDelimitSerDe работать. Вместо этого мне повезло в том, что разделитель имел цитаты по обе стороны трубы. Так это выглядит как "|". Это превращает значения между кавычками в строки, поэтому дополнительные каналы в этих значениях столбцов не действуют как разделители.

«Тест | Тест2» | «Тест3 | Тест 4 | Тест 5» | «Тест 6»

Вы можете увидеть объяснение в ссылке ниже. Об этом говорится в комментариях, а не в статье.

https://www.ericlin.me/2015/07/how-to-create-a-hive-multi-character-delimitered-table/

Если бы у меня не было этих кавычек вокруг разделителя, я не уверен, как бы я мог работать с мульти разделителем. Особенно, если у меня были цитаты в любом из моих полей, но после проверки из миллиардов строк не осталось ни одной кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...