已解決: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