Pyspark替换每个列名中的字符串



我正在将Pandas命令转换为Spark命令。我想把这一行转换成Apache Spark代码:

这一行将每两个空格替换为一个。

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

是否可以使用Spark替换所有列的字符串?我开始研究这个,但它不太正确。

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

说明一下,我想要这个

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

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

您可以对所有列应用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为每个不同的调用创建一个投影,而select只创建单个投影,因此对于大量列,select将快得多。

我有个建议。

我们得到所有的目标列:

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)

这能解决你的问题吗?

最新更新