Pyspark替换每个列名中字符串

8ulbf1ek  于 2022-12-03  发布在  Spark
关注(0)|答案(2)|浏览(186)

我正在将Pandas命令转换为Spark命令。我无意中想将这一行转换为Apache Spark代码:
此行将每两个空格替换为一个。

df = df.columns.str.replace('  ', ' ')

是否可以使用Spark替换所有列中的字符串?我遇到了这个问题,但它不太正确。

df = df.withColumnRenamed('--', '-')

说清楚我想要这个

//+---+----------------------+-----+
//|id |address__test         |state|
//+---+----------------------+-----+

对此

//+---+----------------------+-----+
//|id |address_test          |state|
//+---+----------------------+-----+
b1zrtrql

b1zrtrql1#

您可以在所有数据行上套用replace方法,方法是逐一查看数据行,然后选取,如下所示:

df = spark.createDataFrame([(1, 2, 3)], "id: int, address__test: int, state: int")
df.show()
+---+-------------+-----+
| id|address__test|state|
+---+-------------+-----+
|  1|            2|    3|
+---+-------------+-----+

from pyspark.sql.functions import col

new_cols = [col(c).alias(c.replace("__", "_")) for c in df.columns]
df.select(*new_cols).show()
+---+------------+-----+
| id|address_test|state|
+---+------------+-----+
|  1|           2|    3|
+---+------------+-----+

侧边标注:调用withColumnRenamed会使Spark为每个不同的调用创建一个Projection,而select只创建一个Projection,因此对于大量的列,select会快得多。

n1bvdmb6

n1bvdmb62#

我有个建议。
我们获取所有目标列:

columns_to_edit = [col for col in df.columns if "__" in col]

然后我们使用for循环逐个编辑它们:

for column in columns_to_edit:
    new_column = column.replace("__", "_")
    df = df.withColumnRenamed(column, new_column)

这能解决您的问题吗?

相关问题