【问题标题】:Pyspark Split on first occurance using regexPyspark 使用正则表达式在第一次出现时拆分
【发布时间】:2020-01-06 15:16:01
【问题描述】:

我需要在 '=' 上进行拆分,但仅限于第一次出现。

示例:考虑我的数据框如下。

df.show()


+-----------+

|      Col|

+-----------+

|    He=l=lo|

|How=Are=you|

+-----------+

我希望输出为

df_split.show()

+-----------+-------------+

|      col|          col_split|

+-----------+-------------+

|    He=l=lo|    [He,l=lo]|

|How=Are=y=ou|[How,Are=y=ou]|

+-----------+-------------+

我尝试如下拆分解决方案

from pyspark.sql.functions import split

df.withColumn('col_split',split('col','^(.+?)=')).show()

+-----------+----------+

|      Words|       spl|

+-----------+----------+

|    He=l=lo|  [, l=lo]|

|I am= fi=ne|[,  Are=y=ou]|

+-----------+----------+

注意:我用split(col,'=',1) 尝试了一个简单的UDF,因为数据量很大,速度很慢,有时会无限期挂起。

非常感谢任何帮助。

【问题讨论】:

  • 你可以考虑用df.withColumn("spl_before", regexp_extract("col_split", "^([^=]*)=", 1)).withColumn("spl_after", regexp_extract("col_split", "=(.*)", 1)).show()分成两列

标签: python regex split pyspark


【解决方案1】:

我们去试试这个,你可以试试这个regex

>>> from pyspark.sql.functions import *
>>> df = spark.createDataFrame([["He=l=lo"],["How=Are=you"]],["Col"])
>>> df.show()
+-----------+
|        Col|
+-----------+
|    He=l=lo|
|How=Are=you|
+-----------+
>>> df.withColumn("col_split", split(col("col"), "(?<=^[^=]*)\\=")).show()

+-----------+--------------+
|        Col|     col_split|
+-----------+--------------+
|    He=l=lo|    [He, l=lo]|
|How=Are=you|[How, Are=you]|
+-----------+--------------+

【讨论】:

    【解决方案2】:

    你可以简单地使用substring_index

    df.withColumn("col_split",
                  array(substring_index(col("Col"), "=", 1), substring_index(col("Col"), "=", -2))
                  ).show()
    

    给予:

    +-----------+--------------+
    |        Col|     col_split|
    +-----------+--------------+
    |    He=l=lo|    [He, l=lo]|
    |How=Are=you|[How, Are=you]|
    +-----------+--------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-18
      • 2016-12-22
      • 2021-01-26
      • 2018-06-28
      • 1970-01-01
      相关资源
      最近更新 更多