已解决:Hive查询:有没有一种方法可以通过`cluster by`使用UDTF?
事实证明我的UDTF是一个错误。我找到了一个修复程序,但我不明白它为什么起作用。在我开始实施UDTF时,Eclipse建议不要使用initialize
。但是如果我跳过它,我得到了错误,所以我仍然使用它。我在该方法中放置了一个变量初始化,猜测init只能执行一次。该jar适用于一些更简单的场景,但是如果我要将UDTF输出与UDF一起使用,那么请使用UDF输出来执行某些操作,例如作弊cluster by
或insert
,我得到了前面提到的错误。我的工程师朋友发现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
我这样做试图欺骗配置单元,将临时表t
视为一个“正常”表,我可以将cluster by
应用于cluster by
,希望它能将工作负载分配给所有hadoop奴隶,但不幸的是,配置单元非常聪明,可以看穿我未尝试过的恶作剧。
那么,有人可以帮助我澄清我的错误概念,或给我一些正确的方法来做到这一点?
仅供参考我问过我公司一位经验丰富的工程人员的帮助,他认为这可能是一个更深的系统级错误,他试图在他离开工作前20分钟追踪问题,他确实找到了一些lib版本问题,但毕竟无法解决问题。 ...我猜想这肯定是我做错了。
我认为我的担心归结为如果选择myudtf(“stringValue”)',一个只有地图的作业,是在单个节点上处理还是也分发给所有从属。我是否需要像'cluster by'或'join'这样的洗牌操作来告诉配置单元来分配工作负载。如果是这样,我应该怎么做,或者我不需要做任何事情,而且内部需要蜂房来照顾。 – fanz