在PySpark中将多个列转换为字符串的有效方法

时间:2018-05-16 08:53:57

标签: python types casting pyspark

有关SO(link 1link 2link 3,...)的详细记录,如何在{{1}中将单个变量转换为string类型通过类比:

PySpark

但是,当您有多个要转换为from pyspark.sql.types import StringType spark_df = spark_df.withColumn('name_of_column', spark_df[name_of_column].cast(StringType())) 类型的列时,有几种方法可以实现它:

使用string循环 - 我的代码中的成功方法:

琐碎的例子:

for

这是一种有效的方法,但我认为不是我想要的最佳方法。

使用列表推导 - 我的代码不成功:

我的错误例子:

to_str = ['age', 'weight', 'name', 'id']
for col in to_str:
  spark_df = spark_df.withColumn(col, spark_df[col].cast(StringType()))

收到错误消息时不成功:

  

TypeError:'str'对象不可调用

我的问题是:这是根据我的例子中的spark_df = spark_df.select(*(col(c).cast("string").alias(c) for c in to_str)) 等列名列表在PySpark中将多个列转换为字符串的最佳方法吗?

提前感谢您的建议。

  

后处理澄清编辑:

感谢@Rumoku和@pault反馈:

两个代码行都是正确的:

to_str

spark_df = spark_df.select(*(col(c).cast("string").alias(c) for c in to_str)) # My initial list comprehension expression is correct.

我之前收到了来自spark_df = spark_df.select([col(c).cast(StringType()).alias(c) for c in to_str]) # Initial answer proposed by @Rumoku is correct. 的错误消息,因为我之前更改了PySpark的对象to_str的名称。正如@pault所解释的那样:col(包含所需字符串变量的列表)与列表推导的函数col具有相同的名称,这就是col抱怨的原因。只需将PySpark重命名为col,然后更新to_str即可修复所有内容。

2 个答案:

答案 0 :(得分:0)

应该是:

spark_df = spark_df.select([col(c).cast(StringType()).alias(c) for c in to_str])

答案 1 :(得分:0)

不确定您的解决方案中列表理解部分的 from pyspark.sql.types import StringType to_str = ['age', 'weight', 'name', 'id'] spark_df = spark_df.select( [spark_df[c].cast(StringType()).alias(c) for c in to_str] ) 是什么,但任何寻找解决方案的人都可以试试这个 -

str

要将所有列替换为 to_str 类型,请将 spark_df.columns 替换为 driver.find_elements_by_class_name