蜂巢中的拆分列

Posted

技术标签:

【中文标题】蜂巢中的拆分列【英文标题】:Split column in hive 【发布时间】:2019-07-02 04:45:39 【问题描述】:

我是 Hive 和 Hadoop 框架的新手。我正在尝试编写一个配置单元查询来拆分由管道“|”分隔的列特点。然后我想将两个相邻的值组合起来,并将它们分成单独的行。

例如,我有一张桌子

id mapper

1  a|0.1|b|0.2
2  c|0.2|d|0.3|e|0.6
3  f|0.6

我可以使用 split(mapper, "\\|") 拆分列,这给了我数组

id mapper

1  [a,0.1,b,0.2]
2  [c,0.2,d,0.3,e,0.6]
3  [f,0.6]

现在我尝试使用横向视图将映射器数组拆分为单独的行,但它会将所有值分开,因为我想按组分开。

预期:

id mapper

1  [a,0.1]
1  [b,0.2]
2  [c,0.2]
2  [d,0.3]
2  [e,0.6]
3  [f,0.6]

实际

id mapper

1  a
1  0.1
1  b
1  0.2 
etc .......

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

我建议你分开split(mapper, '(?<=\\d)\\|(?=\\w)'),例如

split('c|0.2|d|0.3|e|0.6', '(?<=\\d)\\|(?=\\w)')

结果

["c|0.2","d|0.3","e|0.6"]

然后分解生成的数组并按| 拆分。

更新:

如果你也有数字并且你的浮点数在小数点后只有一位数字,那么正则表达式应该扩展为split(mapper, '(?&lt;=\\.\\d)\\|(?=\\w|\\d)')

更新 2:

好的,最好的方法是在第二个|上拆分如下

split(mapper, '(?<!\\G[^\\|]+)\\|')

例如

split('6193439|0.0444035224643987|6186654|0.0444035224643987', '(?<!\\G[^\\|]+)\\|')

结果

["6193439|0.0444035224643987","6186654|0.0444035224643987"]

【讨论】:

它适用于字母数字。但是如果输入像split('10|0.2|20|0.3|30|0.6', '(?=\\w)\\|(?=\\w)'),如何实现将导致["10|0.2|20|0.3|30|0.6"] @kars89 ,我编辑了答案,现在它适用于两种情况。 谢谢@serge_k,我明白你在说什么。但是我在小数点后有不止一位数字,还有一些我无法推断出所需的输出。我的真实世界输入是"6193439|0.0444035224643987|6186654|0.0444035224643987"。或者你能给我一个指向我可以在哪里寻找正则表达式指南的指针吗? @kars89 ,我更改了正则表达式,使其在第二个 | 上拆分 所以核心思想在\\G——前一个匹配操作符的结尾(Java专用)。这是很好的例子***.com/questions/2708833/…。基本上,在?&lt;!G[^\\|] 的负面观察下,我们会忽略| 的第一次出现并在第二次出现分裂。老实说,我过去曾用谷歌搜索过这个正则表达式,效果很好。

以上是关于蜂巢中的拆分列的主要内容,如果未能解决你的问题,请参考以下文章

如何将列中的连接值转置为行

蜂巢中的分组/窗口化

熊猫:将列中的列表拆分为多行[重复]

通过解析列中的字符串值将表中的一行拆分为多行

在 Python 中的列中拆分字符串

Pandas: 如何将一列中的文本拆分为多行? | Python