有关SO(link 1,link 2,link 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
即可修复所有内容。
答案 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
。