python - 在HIVE中爆炸

标签 python hadoop split hive user-defined-functions

我遇到了一个有趣的问题。我有一个称为Python UDF的HIVE脚本,用于处理一些日期。 Python的输出为6列,3为字符串,3为数组。

例如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;  


问题2:我得到以下输出:
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

最佳答案

在我的想法中,您有一个水平表,但是您需要一个垂直表。我不知道
如何使用Hive解决这个问题,所以我用mapreduce解决了。
是的,在这种情况下使用mapreduce非常容易。
这是一个中文示例,但是您只需要了解Java代码即可。
mapreduce example

关于python - 在HIVE中爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25595491/

相关文章:

hadoop - hive 顺序按1升序排列会导致错误

python:根据部分标题提取文件,并在标题中使用分割条件

java - 为什么 "\t"在 Java String.split 中有效,但在 "\."中无效?

带有带括号的 header 的 Python DataFrame 错误

python - 为什么我的列表列表仅部分转换为字典?

python - Pipenv-错误 : ModuleNotFoundError: No module named 'pip._internal'

hadoop - Map Reduce 作业设计

Python: "except KeyError"比 "if key in dict"快吗?

python - 使用python从HDFS获取文件名列表

Python:拆分由给定对象类型分隔的字符串