gpt4 book ai didi

scala - 在 spark-shell 中拆分多行

转载 作者:行者123 更新时间:2023-12-05 01:24:33 24 4
gpt4 key购买 nike

我已经在 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”是十六进制数的类型):

所以,输出应该是:

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。提前致谢。

最佳答案

得到这个后编辑answer关于如何在 regexp_replace 中进行反向引用。

您可以使用带有反向引用的 regexp_replace,然后 split 两次并 explode。在我看来,它比我原来的解决方案更干净

val df = List(
("A1" , "11" , "B2" , "a|b;1;0xFFFFFF"),
("A1" , "12" , "B1" , "2"),
("A2" , "12" , "B2" , "0xFFF45B")
).toDF("Col1" , "Col2" , "Col3" , "Col4")

val regExStr = "^([A-z|]+)?;?(\\d+)?;?(0x.*)?$"
val res = df
.withColumn("backrefReplace",
split(regexp_replace('Col4,regExStr,"$1;$2;$3"),";"))
.select('Col1,'Col2,'Col3,
explode(split('backrefReplace(0),"\\|")).as("letter"),
'backrefReplace(1) .as("digits"),
'backrefReplace(2) .as("hexadecimal")
)

+----+----+----+------+------+-----------+
|Col1|Col2|Col3|letter|digits|hexadecimal|
+----+----+----+------+------+-----------+
| A1| 11| B2| a| 1| 0xFFFFFF|
| A1| 11| B2| b| 1| 0xFFFFFF|
| A1| 12| B1| | 2| |
| A2| 12| B2| | | 0xFFF45B|
+----+----+----+------+------+-----------+

虽然......你仍然需要用null替换空字符串......


上一个答案(可能仍然有人喜欢它):

这是一个坚持 DataFrames 但也很困惑的解决方案。您可以先使用 regexp_extract 三次(反向引用可能做的更少?),最后 split 在“|”上和爆炸。请注意,您需要合并 explode 才能返回所有内容(在此解决方案中,您仍然可能希望将 letter 中的空字符串更改为 null) .

val res = df
.withColumn("alphabets", regexp_extract('Col4,"(^[A-z|]+)?",1))
.withColumn("digits", regexp_extract('Col4,"^([A-z|]+)?;?(\\d+)?;?(0x.*)?$",2))
.withColumn("hexadecimal",regexp_extract('Col4,"^([A-z|]+)?;?(\\d+)?;?(0x.*)?$",3))
.withColumn("letter",
explode(
split(
coalesce('alphabets,lit("")),
"\\|"
)
)
)


res.show

+----+----+----+--------------+---------+------+-----------+------+
|Col1|Col2|Col3| Col4|alphabets|digits|hexadecimal|letter|
+----+----+----+--------------+---------+------+-----------+------+
| A1| 11| B2|a|b;1;0xFFFFFF| a|b| 1| 0xFFFFFF| a|
| A1| 11| B2|a|b;1;0xFFFFFF| a|b| 1| 0xFFFFFF| b|
| A1| 12| B1| 2| null| 2| null| |
| A2| 12| B2| 0xFFF45B| null| null| 0xFFF45B| |
+----+----+----+--------------+---------+------+-----------+------+

注意:正则表达式部分可以通过反向引用变得更好,所以如果有人知道如何做,请发表评论!

关于scala - 在 spark-shell 中拆分多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40146760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com