首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在PySpark中将多个列转换为字符串的有效方法

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

Stack Overflow用户
提问于 2018-05-16 08:53:56
回答 2查看 6.9K关注 0票数 3

在SO上有很好的记录(link 1link 2link 3,.)如何通过类推将单个变量转换为string类型的PySpark

代码语言:javascript
复制
from pyspark.sql.types import StringType    
spark_df = spark_df.withColumn('name_of_column', spark_df[name_of_column].cast(StringType()))

但是,当您有几个要转换为string类型的列时,有几种方法可以实现它:

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

微不足道的例子:

代码语言:javascript
复制
to_str = ['age', 'weight', 'name', 'id']
for col in to_str:
  spark_df = spark_df.withColumn(col, spark_df[col].cast(StringType()))

这是一个有效的方法,但我相信不是我正在寻找的最佳方法。

使用列表理解的 --在我的代码中不是成功的:

我的错误例子:

代码语言:javascript
复制
spark_df = spark_df.select(*(col(c).cast("string").alias(c) for c in to_str))

当我收到错误消息时,不会成功:

TypeError:“str”对象不可调用

那么,我的问题是:,这将是根据示例中的这样的列名在PySpark中将多个列转换为字符串的最佳方法?

提前谢谢你的建议。

后向澄清编辑:

感谢@Rumoku和@pault的反馈:

这两行代码都是正确的:

代码语言:javascript
复制
spark_df = spark_df.select(*(col(c).cast("string").alias(c) for c in to_str)) # My initial list comprehension expression is correct.

代码语言:javascript
复制
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就可以修复所有问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-16 11:37:02

它应该是:

代码语言:javascript
复制
spark_df = spark_df.select([col(c).cast(StringType()).alias(c) for c in to_str])
票数 1
EN

Stack Overflow用户

发布于 2021-07-02 06:42:22

不确定您的解决方案中列表理解部分的col()是什么,但是任何寻找该解决方案的人都可以尝试-

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50366396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档