2012-12-06 24 views
3

我正在使用gzipped JSON編碼文件在Amazon的Elastic MapReduce上創建Hive表。我用這JSON SERDE:http://code.google.com/p/hive-json-serde/Hive:將逗號分隔的字符串轉換爲數組以生成表格功能

未編碼文件看起來是這樣的:

{"id":"101", "items":"A:231,234,119,12"} 

{"id":"102", "items":"B:13,89,121"} 

...

我想打造的「項目」列的排列與用戶一個表格生成功能。我想要的數組將是整數的「分解」CSV,忽略「:」和之前的字母。我希望能夠GROUP BY項目整數(231,234等)或加入他們對其他表。改變這個文件的格式會很困難,我所有的舊數據都以這種格式存儲,所以我想在Hive中解決這個問題,而不需要改變如何存儲數據。

有沒有辦法讓我這樣做?

編輯:

感謝@ mark-grover,這工作!

我做了這樣的事情:

SELECT id, item FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item 

獲得:

101 231 

101 234 

101 119 

101 12 

102 13 

102 89 

102 121 

在這一過程中,我發現了我想要做的多一點。我還想選擇每個項目在CSV中的位置。所以我想輸出看起來像:

101 231 0 

101 234 1 

101 119 2 

101 12 3 

102 13 1 

102 89 2 

102 121 3 

這裏的任何想法?再次

編輯:

我想出了我的後續問題做這樣的事情:

SELECT id, item, find_in_set(item, substr(items, 3, length(items) - 2)) AS position 
FROM my_table LATERAL VIEW explode(split(substr(items, 3, length(items) - 2), ',')) t1 AS item 

回答

4

你可以做到這一點使用Hive UDFs。 您可能想要使用拆分UDF以逗號分割字符串以獲取數組,然後使用Lateral view along with explode UDTF「爆炸」數組的內容。

要回答你的第二個問題: 這是我現在能想到的。可能有一個更好/更容易/更少黑客的方式來做到這一點。

創建一個UDF說split_extended將返回一個結構與2個元素,第一個是數組元素的實際內容,第二個是索引。當你爆炸這個爆炸列的類型將是一個結構。這個結構的其中一個條目是數組中的實際元素,另一個則是元素對應的索引。

如果你考慮一下,我們將擴大分割UDF以返回2條信息 - 元素和索引。這些是將單個對象返回這些信息的幾種方法 - 結構就是其中之一,數組是另一個(數組的第一個元素是數組中的實際元素,第二個元素是索引)。返回2條信息的另一個比較冒險的方法是將它們與一些你知道在你的數據中不存在的東西(比如':')連接起來,這樣你就可以讓你的UDF返回'231:0','234:0 ','119:2'等。並最終而不是訪問它們的結構成員,你可以根據':'(使用分割UDF)分割出結果字符串來獲得所需的兩部分。

爲了創建您自己的UDF,您將能夠利用大多數(即使不是全部)可用的拆分UDF代碼here

+0

謝謝,馬克!我有一個後續問題,可能很難或不可能(請參閱我對原始問題的編輯)。如果您有任何想法,請告訴我。 – dubois

+0

我編輯了我的答案來回答你的第二個問題。祝你好運! –

+0

啊,謝謝,馬克 - 尤其是指向UDF代碼的指針。我最終找出了使用find_in_set()的東西,所以我不必編寫自己的UDF。非常感謝您的幫助。 – dubois

相關問題