蜂巢中的拆分列
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, '(?<=\\.\\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/…。基本上,在?<!
和G[^\\|]
的负面观察下,我们会忽略|
的第一次出现并在第二次出现分裂。老实说,我过去曾用谷歌搜索过这个正则表达式,效果很好。以上是关于蜂巢中的拆分列的主要内容,如果未能解决你的问题,请参考以下文章