如何使用带管道的多字符分隔符进行拆分?

dre*_*ddy 2 scala apache-spark apache-spark-sql

我试图根据分隔符":|:|:"在spark中拆分数据帧的字符串列

Input:
TEST:|:|:51:|:|:PHT054008056
Run Code Online (Sandbox Code Playgroud)

测试代码:

dataframe1
.withColumn("splitColumn", split(col("testcolumn"), ":|:|:"))
Run Code Online (Sandbox Code Playgroud)

结果:

+------------------------------+
|splitColumn                   |
+------------------------------+
|[TEST, |, |, 51, |, |, P]     |   
+------------------------------+
Run Code Online (Sandbox Code Playgroud)

测试代码:

dataframe1
.withColumn("part1", split(col("testcolumn"), ":|:|:").getItem(0))
.withColumn("part2", split(col("testcolumn"), ":|:|:").getItem(3))
.withColumn("part3", split(col("testcolumn"), ":|:|:").getItem(6))
Run Code Online (Sandbox Code Playgroud)

part1和part2正常工作.part3只有2个字符,其余的字符串被截断.

第三部分:

P
Run Code Online (Sandbox Code Playgroud)

我想得到整个part3字符串.任何帮助表示赞赏.

Leo*_*o C 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|
// +---+--------------------+------------+
Run Code Online (Sandbox Code Playgroud)

[UPDATE]

您还可以使用三引号作为分隔符,在这种情况下,您仍然必须转义|以指示它是文字管道(不在orRegex中):

df.withColumn("part3", split($"testcolumn", """:\|:\|:""").getItem(2)).show
Run Code Online (Sandbox Code Playgroud)

请注意,对于三引号,您只需要一个转义字符\,而没有三引号,转义字符本身需要转义(因此\\).