如何替换 Spark 数据帧的所有列中的多个字符



我有一个包含多列的数据帧。

>>> df.take(1)
[Row(A=u'{dt:dt=string, content=Prod}', B=u'{dt:dt=string, content=Staging}')]

我想从df的"A"和"B"列的值中删除{}两个大括号。我知道我们可以使用:

df.withColumn('A', regexp_replace('A', '//{', ''))
df.withColumn('A', regexp_replace('A', '//}', ''))
df.withColumn('B', regexp_replace('B', '//}', ''))

如何动态替换 Spark 数据帧所有列的字符?(熊猫版本如下所示(

df = df.replace({'{':'', '}':''}, regex=True)

只需使用正确的正则表达式:

df.withColumn("A", regexp_replace("A", "[{}]", ""))

要修改数据帧df并将regexp_replace应用于listOfColumns给出的多个列,您可以像这样使用 foldLeft:

val newDf = listOfColumns.foldLeft(df)((acc, x) => acc.withColumn(x, regexp_replace(col(x), ..., ...)))

要将列表达式应用于 PySpark 中数据帧的每一列,您可以将 Python 的列表推导与 Spark 的 select 一起使用。 例如:

df.select([column_expression for c in df.columns])

完整示例:

from pyspark.sql import functions as F
df = spark.createDataFrame(
    [('{dt:dt=string, content=Prod}', '{dt:dt=string, content=Staging}')],
    ['A', 'B'])
df = df.select([F.regexp_replace(c, '[{}]', '').alias(c) for c in df.columns])
df.show(truncate=0)
# +--------------------------+-----------------------------+
# |A                         |B                            |
# +--------------------------+-----------------------------+
# |dt:dt=string, content=Prod|dt:dt=string, content=Staging|
# +--------------------------+-----------------------------+

相关内容

  • 没有找到相关文章

最新更新