在SO上有很好的记录(link 1,link 2,link 3,.)如何通过类推将单个变量转换为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()))这是一个有效的方法,但我相信不是我正在寻找的最佳方法。
使用列表理解的 --在我的代码中不是成功的:
我的错误例子:
spark_df = spark_df.select(*(col(c).cast("string").alias(c) for c in to_str))当我收到错误消息时,不会成功:
TypeError:“str”对象不可调用
那么,我的问题是:,这将是根据示例中的这样的列名在PySpark中将多个列转换为字符串的最佳方法?
提前谢谢你的建议。
后向澄清编辑:
感谢@Rumoku和@pault的反馈:
这两行代码都是正确的:
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的名称,所以我收到了来自col的错误消息。正如@pault解释的:col (包含所需字符串变量的列表)与列表理解的函数col具有相同的名称,这就是PySpark抱怨的原因。只需将col重命名为to_str,并更新spark-notebook就可以修复所有问题。
发布于 2018-05-16 11:37:02
它应该是:
spark_df = spark_df.select([col(c).cast(StringType()).alias(c) for c in to_str])发布于 2021-07-02 06:42:22
不确定您的解决方案中列表理解部分的col()是什么,但是任何寻找该解决方案的人都可以尝试-
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。
https://stackoverflow.com/questions/50366396
复制相似问题