2016-10-25 91 views
1

我用Python寫的像蜂巢UDAFs試驗:蜂巢UDAF:鑄造非Java蜂巢UDAF的輸出到地圖

SELECT TRANSFORM(id, vtype, price) USING 'udaf.py' 
    AS (vtype STRING, stats MAP<STRING,FLOAT>)   
    FROM (SELECT * FROM foo CLUSTER BY vtype) AS TEMP_TABLE; 

的Python腳本編寫的V型和一些統計數據,例如均值和方差,作爲標準輸出的字典,由一個可以正常工作的製表符分隔。我遇到的問題是我無法弄清楚如何格式化定義統計信息映射的字段,以便HiveQL可以將其轉換爲MAP,如我的查詢中所定義。無論我試過我的統計領域是這樣的:

{"{mean:1.0,var:2.0}":null} 

在上面的例子中我試圖恢復它作爲JSON字符串和HiveQL解釋這個關鍵,並設置的價值。徹底閱讀HiveQL文檔我也嘗試了諸如「mean:1.0,var:2.0」,「MAP(mean:1.0,var:2.0)」,「mean:1.0,var:2.0」等等,但沒有任何成效。實際上有一種內置的方式可以與Hive在Cloudera上做到這一點嗎?

回答

0

映射在配置元表中的映射的默認分隔符是映射鍵和映射值之間的'\003'(unicode 0x03)和集合元素(其中映射是鍵值對的集合)之間的\002(unicode 0x02)。

所以,你的情況,我會嘗試或者使用

ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\001' 
COLLECTION ITEMS TERMINATED BY ',' 
MAP KEYS TERMINATED BY ':' 

這可能是危險的是你必須在其他領域冒號逗號覆蓋表分隔符。

或者您可以嘗試使用默認分隔符輸出您的地圖。

如果不工作,你可以得到從UDAF一個字符串,並使用

str_to_map(text, ',', ':')

+1

所以輸出「'意思是\ x031.0 \ x02variance \ x032.0」把它變成一個地圖'在Python腳本中工作!謝謝。還應該提到'str_to_map'只能用於'map '所以沒有浮點鍵。 – fwilhelm