我试图根据分隔符":|:|:"
在spark中拆分数据帧的字符串列Input:
TEST:|:|:51:|:|:PHT054008056
测试代码:
dataframe1
.withColumn("splitColumn", split(col("testcolumn"), ":|:|:"))
结果:
+------------------------------+
|splitColumn |
+------------------------------+
|[TEST, |, |, 51, |, |, P] |
+------------------------------+
测试代码:
dataframe1
.withColumn("part1", split(col("testcolumn"), ":|:|:").getItem(0))
.withColumn("part2", split(col("testcolumn"), ":|:|:").getItem(3))
.withColumn("part3", split(col("testcolumn"), ":|:|:").getItem(6))
part1和part2正常工作。 part3只有2个字符,其余的字符串被截断。
3部分:
P
我想获得整个part3字符串。 任何帮助表示赞赏。
答案 0 :(得分:6)
你几乎就在那里 - 只需要在分隔符内转义|
,如下所示:
val df = Seq(
(1, "TEST:|:|:51:|:|:PHT054008056"),
(2, "TEST:|:|:52:|:|:PHT053007057")
).toDF("id", "testcolumn")
df.withColumn("part3", split($"testcolumn", ":\\|:\\|:").getItem(2)).show
// +---+--------------------+------------+
// | id| testcolumn| part3|
// +---+--------------------+------------+
// | 1|TEST:|:|:51:|:|:P...|PHT054008056|
// | 2|TEST:|:|:52:|:|:P...|PHT053007057|
// +---+--------------------+------------+
[UPDATE]
您还可以使用三引号作为分隔符,在这种情况下,您仍然必须转义|
以指示它是文字管道(在Regex中不是or
):
df.withColumn("part3", split($"testcolumn", """:\|:\|:""").getItem(2)).show
请注意,对于三引号,您只需要一个转义字符\
,而如果没有三引号,则转义字符本身需要转义(因此\\
)。