蜂巢中的拆分栏

时间:2019-07-02 04:45:39

标签: sql hadoop hive apache-spark-sql hiveql

我是Hive和Hadoop框架的新手。我正在尝试编写配置单元查询以拆分由管道'|'分隔的列字符。然后,我想将2个相邻的值归为一组,并将它们分成单独的行。

例如,我有一张桌子

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]

现在,我尝试使用侧面视图将mapper数组拆分为单独的行,但是它将所有值分开,因为我想按组分开。

预期:

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 个答案:

答案 0 :(得分: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"]