我已经在spark shell的spark dataframe中导入了数据。数据的填写方式如下:
Col1 | Col2 | Col3 | Col4
A1 | 11 | B2 | a|b;1;0xFFFFFF
A1 | 12 | B1 | 2
A2 | 12 | B2 | 0xFFF45B
在col4中,值有不同的种类,我想把它们分开,就像(假设“a | b”是字母表的类型,“1或2”是数字的类型,“0xffffff或0xfff45b”是十六进制no的类型):
所以,输出应该是:
Col1 | Col2 | Col3 | alphabets | digits | hexadecimal
A1 | 11 | B2 | a | 1 | 0xFFFFFF
A1 | 11 | B2 | b | 1 | 0xFFFFFF
A1 | 12 | B1 | | 2 |
A2 | 12 | B2 | | | 0xFFF45B
希望我已经向你澄清了我的疑问,我正在使用spark shell。提前谢谢。
2条答案
按热度按时间b5buobof1#
在得到关于如何在中进行反向引用的答案后进行编辑
regexp_replace
.你可以用
regexp_replace
有一个反向引用split
两次和explode
. 在我看来,这比我原来的解决方案更干净您仍然需要将空字符串替换为
null
不过。。。先前的答案(可能仍有人喜欢):
这里有一个解决方案,坚持Dataframe,但也相当混乱。你可以先用
regexp_extract
三次(使用反向引用可以做得更少?),最后split
在“|”和explode
. 请注意,您需要为explode
要返回所有内容(您可能仍希望更改中的空字符串)letter
至null
在此解决方案中)。注意:regexp部分可以更好地使用backreference,所以如果有人知道如何做,请发表评论!
zyfwsgd62#
在100%使用Dataframe的情况下,不确定这是否可行,这里有一个(有点混乱?)解决方案,使用RDD进行拆分: