2017-03-15 64 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檢查變量是否爲空,如果是則初始化它。然後一切正常,我的作弊也工作。不過,如果有人能給我一個更具體的解釋,我會非常感激。

相關問題