【问题标题】:Add single quotes to the dataFrame column values将单引号添加到 dataFrame 列值
【发布时间】:2020-03-02 15:13:50
【问题描述】:

DataFrame 持有一列QUALIFY,其值如下所示。

QUALIFY
=================
ColA|ColB|ColC
ColA
ColZ|ColP

此列中的值由"|" 分割。我希望此列中的值类似于'ColA','ColB','ColC' ...

使用下面的代码,我可以将| 替换为,',。如何在值的开头和结尾添加单引号?

newDf = df_qualify.withColumn('QUALIFY2', regexp_replace('QUALIFY', "\\|", "\\','"))

【问题讨论】:

  • 为什么不先在| 上拆分它,然后将结果数组连接回字符串?

标签: dataframe apache-spark pyspark databricks


【解决方案1】:

| 上拆分列,然后将结果数组连接回字符串:

import pyspark.sql.functions as F
import pyspark.sql.types as T

def str_list(x):
    return str(x).replace("[", "").replace("]", "")

str_udf = F.udf(str_list, T.StringType())

df = df.withColumn("arr_split", F.split(F.col("QUALIFY"), "\|")) # escape character
df = df.withColumn("QUALIFY2", str_udf(F.col("arr_split")))

我的示例输出帧:

df.drop("arr_split").show() # Please ignore a and b columns
+---+---+--------------+--------------------+
|  a|  b|           abc|            QUALIFY2|
+---+---+--------------+--------------------+
|  1|  1|col1|col2|col3|'col1', 'col2', '...|
|  2|  2|col1|col2|col3|'col1', 'col2', '...|
|  3|  3|col1|col2|col3|'col1', 'col2', '...|
|  4|  4|col1|col2|col3|'col1', 'col2', '...|
|  5|  5|col1|col2|col3|'col1', 'col2', '...|
+---+---+--------------+--------------------+

【讨论】:

    【解决方案2】:

    您的解决方案几乎就在那里 - 您只需在开头和结尾添加一个单引号。您可以使用pyspark.sql.functions.concat 实现此目的:

    from pyspark.sql.functions import col, concat, lit, regexp_replace
    
    df.withColumn(
        "QUALIFY2",
        concat(lit("'"), regexp_replace(col('QUALIFY'), r"\|", r"','"), lit("'"))
    ).show()
    #+--------------+--------------------+
    #|       QUALIFY|            QUALIFY2|
    #+--------------+--------------------+
    #|ColA|ColB|ColC|'ColA','ColB','ColC'|
    #|          ColA|              'ColA'|
    #|     ColZ|ColP|       'ColZ','ColP'|
    #+--------------+--------------------+
    

    或者,您可以避免使用正则表达式并使用splitconcat_ws 实现相同的目的:

    from pyspark.sql.functions import split, concat_ws
    df.withColumn(
        "QUALIFY2", 
        concat(lit("'"), concat_ws("','", split("QUALIFY", "\|")), lit("'"))
    ).show()
    #+--------------+--------------------+
    #|       QUALIFY|            QUALIFY2|
    #+--------------+--------------------+
    #|ColA|ColB|ColC|'ColA','ColB','ColC'|
    #|          ColA|              'ColA'|
    #|     ColZ|ColP|       'ColZ','ColP'|
    #+--------------+--------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多