Добавьте одинарные кавычки в значения столбца dataFrame - PullRequest
1 голос
/ 06 ноября 2019

DataFrame содержит столбец QUALIFY со значениями, как показано ниже.

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

Значения в этом столбце делятся на "|". Я хочу, чтобы значения в этом столбце были такими, как 'ColA','ColB','ColC' ...

. С помощью приведенного ниже кода я могу заменить | на ,',. Как добавить одинарную кавычку в начале и конце значения?

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

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Ваше решение почти готово - вам просто нужно добавить одинарную цитату в начало и конец. Вы можете достичь этого, используя 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'|
#+--------------+--------------------+

В качестве альтернативы, вы можете избежать регулярных выражений и добиться того же, используя split и concat_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'|
#+--------------+--------------------+
1 голос
/ 06 ноября 2019

Разделить столбец на | и затем присоединить полученный массив обратно к строке:

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', '...|
+---+---+--------------+--------------------+
...