【问题标题】:How to split using multi-char separator with pipe?如何使用带有管道的多字符分隔符进行拆分?
【发布时间】:2018-09-06 13:33:10
【问题描述】:

我正在尝试根据分隔符“:|:|:”在 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 个字符,字符串的其余部分被截断。

第三部分:

P

我想获取整个 part3 字符串。 任何帮助表示赞赏。

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    你就快到了 - 只需在分隔符内转义 |,如下所示:

    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|
    // +---+--------------------+------------+
    

    [更新]

    您也可以使用三引号作为分隔符,在这种情况下,您仍然需要转义 | 以表明它是一个文字管道(不是正则表达式中的 or):

    df.withColumn("part3", split($"testcolumn", """:\|:\|:""").getItem(2)).show
    

    请注意,使用三引号时,您只需要一个转义字符 \,而如果没有三引号,则需要转义字符本身(因此需要转义 \\)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 2013-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2015-10-13
      相关资源
      最近更新 更多