Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?

Posted

技术标签:

【中文标题】Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?【英文标题】:Hive query: Is there a way to use UDTF with `cluster by`? 【发布时间】:2017-03-15 14:33:23 【问题描述】:

已解决:

事实证明这是我的 UDTF 中的一个错误。我找到了一个修复方法,但我不太明白它为什么会起作用。在我开始实施 UDTF 时,Eclipse 建议不推荐使用 initialize。但是如果我跳过它会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测初始化只需要执行一次。该 jar 适用于一些更简单的场景,但如果我将 UDTF 输出与 UDF 一起使用,然后使用 UDF 输出做一些事情,比如作弊cluster byinsert,我得到了前面提到的错误。我的工程师朋友发现initialize 实际上被执行了不止一次。所以我只是把初始化放在process 中,用if 检查变量是否为空,如果是则初始化它。然后一切正常,我的作弊也奏效了。不过,如果有人能给我一个解释,我将不胜感激。


以下是我最初的问题:


我知道我不应该在 UDTF 之后使用 cluster by,所以 select myudtf("stringValue") cluster by rand() 不起作用。

但是由于我的 udtf 每小时输出 7000 多行并且还在增长,所以我真的需要将后续处理分配给我所有的 hadoop 集群从属单元。

我想如果不使用cluster by rand(),我不会得到它,所以我尝试了以下作弊:

首先我用另一个表 select key from (select myudtf("stringValue") as key) t limit 1; 将结果包装起来,它给出了正确的结果,

OK
some/key/value/string
Time taken: 0.035 seconds, Fetched: 1 row(s)

然后我添加cluster by 部分,select key from (select myudtf("stringValue") as key) t cluster by rand() limit 1,然后我得到错误:

WARNING: Hive-on-MR is deprecated in Hive ...
....

Task with the most failures(4): 
-----
Task ID:
  task_....

URL:
  http:....
....
-----
Diagnostic Messages for this Task:
Error: tried to access class sun.security.ssl.SSLSessionContextImpl from class sun.security.ssl.SSLSessionContextImplConstructorAccess

FAILED: Execution Error, return code 2 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
MapReduce Jobs Launched: 
Stage-Stage-1: Map: 1  Reduce: 1   HDFS Read: 0 HDFS Write: 0 FAIL
Total MapReduce CPU Time Spent: 0 msec

我这样做是为了欺骗 hive 将临时表 t 视为“正常”表,我可以将 cluster by 应用于它,希望它将工作负载分配给所有 hadoop 从属服务器,但不幸的是 hive足够聪明,可以看穿我尝试失败的伎俩。

那么,谁能帮我澄清一下我的误解,或者给我一些正确的方法提示?

仅供参考,我向我公司一位经验丰富的工程人员寻求帮助,他认为这可能是一个更深层次的系统级错误,他试图在下班前 20 分钟追踪问题,他确实发现了一些 lib 版本问题但毕竟无法解决问题。 ......我只是想这一定是我做错了什么。

【问题讨论】:

我认为我的担忧归结为select myudtf("stringValue"),一个仅映射的作业,是在单个节点上处理还是分发给所有从属节点。我是否必须进行像cluster byjoin 这样的随机操作来告诉hive 分配工作负载。如果是这样,我应该怎么做,或者我不需要做任何事情,hive 内部会处理。 【参考方案1】:

事实证明这是我的 UDTF 中的一个错误。我找到了一个修复方法,但我不太明白它为什么会起作用。在我开始实施 UDTF 时,Eclipse 建议不推荐使用 initialize。但是如果我跳过它会出错,所以我还是实现了它。我在该方法中放置了一个变量初始化,猜测初始化只需要执行一次。该 jar 适用于一些更简单的场景,但如果我将 UDTF 输出与 UDF 一起使用,然后使用 UDF 输出做一些事情,比如作弊cluster byinsert,我得到了前面提到的错误。我的工程师朋友发现初始化实际上执行了不止一次。所以我只是把初始化放在process,用if检查变量是否为空,如果是则初始化它。然后一切正常,我的作弊也奏效了。不过,如果有人能给我更具体的解释,我将不胜感激。

【讨论】:

以上是关于Hive 查询:有没有办法将 UDTF 与“cluster by”一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

hive自定义UDTF函数,步骤讲解

Hive UDTF开发指南

Hive 通用 UDTF 因数组索引超出范围错误而失败

hive常用UDF and UDTF函数介绍-lateral view explode()

hive-UDF/UDTF/UDAF

Hive学习之Lateral View