2014-08-31 98 views
-1

我遇到了一個有趣的問題。我有一個調用Python UDF的HIVE腳本來操縱一些日期。 Python的輸出是6列,3個是字符串,3個是數組。爆炸HIVE中的字符串

例如print '%s\t%s\t%s\t%s\t%s\t%s\t%s' % (ID1, ID2, ID3, ARR1, ARR2, ARR3)

這裏是我的Python UDF的輸出中的一行:

10161 10400511433810000  (0000010161, 10400511433810001) ["0011583180","0011583180","0011583180"]  ['2004-04-16', '2004-04-16', '2004-04-16']  ['2004-09-03', '2004-09-03', '2004-09-03']  

# 問題1: 我使用%s因爲我無法找到一個方法來返回數組的方式來HIVE HIVE會將它們讀作陣列。

因此,我在HIVE中創建了一個表格,它甚至將數組作爲字符串輸入,假定我可以將字符串拆分爲數組。腳本我用:

insert overwrite table table2 
SELECT 
ID1, 
ID2, 
ID3, 
SPLIT(ARR1, '\\\t') as ARR1, 
SPLIT(ARR2, '\\\t') as ARR2, 
SPLIT(ARR3, '\\\t') as ARR3 
FROM table1 
LIMIT 10; 

# PROBLEM2:我得到以下輸出:

0000010167  10400514362740001  (0000010167, 10400514362740001) ["[\"0022136941\",\"0022315161\"]"]  ["['1900-01-01', '2007-05-01']"]  ["['1900-01-01', '2008-06-16']"]   

我實際上需要的是:

0000010167  10400514362740001  (0000010167, 10400514362740001)  0022136941  1900-01-01  1900-01-01 
0000010167  10400514362740001  (0000010167, 10400514362740001)  0022315161  2007-05-01  2008-06-16 

回答

0

在我的想法,你有水平表,但你需要的是一個垂直的表格。我不知道 如何使用Hive來解決這個問題,所以我用mapreduce解決了它。 是的,在這種情況下使用mapreduce很容易。 這是一箇中文例子,但你只需要瞭解Java代碼。 mapreduce example

0

您可能想看看Exhibit,這是Hive UDFs/UDTF的原型,它們在行內執行嵌套的SQL查詢,並將其與Lateral view關聯。