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

时间:2017-03-15 14:33:23

标签: hadoop hive

解决:

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

以下是我原来的问题:

我知道我不应该在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

我这样做是为了欺骗配置单元将临时表t视为“普通”表,我可以将cluster by应用于此表,希望它能将工作负载分配给所有hadoop从站,但不幸的是,蜂巢很聪明,可以看透我糟糕的尝试。

那么,有人可以帮助我澄清我的错误观念,或者给我一些正确的方法来做这个吗?

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

1 个答案:

答案 0 :(得分:1)

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

相关问题