Amazon Hive 中的多分隔符 SerDe 设置

Posted

技术标签:

【中文标题】Amazon Hive 中的多分隔符 SerDe 设置【英文标题】:MultiDelimiterSerDe setup in Amazon Hive 【发布时间】:2019-01-24 18:34:46 【问题描述】:

我正在尝试在表格插入中使用多重分隔符,以便在亚马逊 aws 上的 emr 中进行配置单元作业。如此链接中所述。文件的分隔符是“|”。

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

好的。所以当我没有得到那个错误时,通过添加.contrib,我得到这个错误是由 Caused by: 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;

所以我不知道该怎么办。尽管我添加了 hive-contrib 的 .jar 文件,但它的行为好像不在类路径中。我也试过跑步...

export HADOOP_USER_CLASSPATH_FIRST=true

在这里找到...

How to include jars in Hive (Amazon Hadoop env)

这也不能解决问题。

如何将多分隔符 SerDe 属性用于 aws 上的 Hive 作业?

谢谢。

【问题讨论】:

【参考方案1】:

我无法让 MultiDelimitSerDe 工作。相反,我很幸运,分隔符在管道的两侧都有引号。所以它看起来像“|”。这会将引号之间的值转换为字符串,因此这些列值中的附加管道不会充当分隔符。

“测试|测试2”|“测试3|测试4|测试5”|“测试6”

您可以在下面的链接中看到解释。谈论它的部分是在 cmets 中,而不是文章。

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

如果分隔符周围没有引号,我不确定如何使用多重分隔符。特别是如果我在我的任何领域都有引用,但在检查后,在数十亿行中,没有一个引用。

【讨论】:

以上是关于Amazon Hive 中的多分隔符 SerDe 设置的主要内容,如果未能解决你的问题,请参考以下文章

hive serde 中多分隔符字符串的正则表达式

在 Hive 中使用 Regex Serde 创建表返回错误

Hive 如何存储数据,啥是 SerDe?

Hive建表-分隔符

hive多分隔符

hive查询结果导入hadoop文件系统如何修改分隔符?insert overwrite directory...