在HIVE中拆分字符串

-1 投票
2 回答
750 浏览
提问于 2025-04-19 02:47

我遇到了一个有趣的问题。我有一个HIVE脚本,它调用了一个Python的用户自定义函数(UDF),用来处理一些日期。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

2 个回答

0

你可以看看Exhibit,这是一个关于Hive的用户定义函数(UDFs)和用户定义表函数(UDTFs)的原型,它可以在行内执行嵌套的SQL查询。同时,你也可以把它和Lateral view结合起来理解。

0

在我看来,你现在有一个横向的表格,但你需要的是一个纵向的表格。我不知道怎么用Hive来解决这个问题,所以我用MapReduce来解决了。没错,在这种情况下,用MapReduce非常简单。这是一个中文的例子,但你只需要理解Java代码就可以了。mapreduce示例

撰写回答