2017-03-15 42 views
1

已解决:Hive查询:有没有一种方法可以通过`cluster by`使用UDTF?

事实证明我的UDTF是一个错误。我找到了一个修复程序,但我不明白它为什么起作用。在我开始实施UDTF时,Eclipse建议不要使用initialize。但是如果我跳过它,我得到了错误,所以我仍然使用它。我在该方法中放置了一个变量初始化,猜测init只能执行一次。该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 

我这样做试图欺骗配置单元,将临时表t视为一个“正常”表,我可以将cluster by应用于cluster by,希望它能将工作负载分配给所有hadoop奴隶,但不幸的是,配置单元非常聪明,可以看穿我未尝试过的恶作剧。

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

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

+0

我认为我的担心归结为如果选择myudtf(“stringValue”)',一个只有地图的作业,是在单个节点上处理还是也分发给所有从属。我是否需要像'cluster by'或'join'这样的洗牌操作来告诉配置单元来分配工作负载。如果是这样,我应该怎么做,或者我不需要做任何事情,而且内部需要蜂房来照顾。 – fanz

回答

0

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

相关问题