我有一个包含多列的数据帧。
>>> 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|
# +--------------------------+-----------------------------+