如何在 Spark 中收集单列?

Posted

技术标签:

【中文标题】如何在 Spark 中收集单列?【英文标题】:How do I collect a single column in Spark? 【发布时间】:2016-02-19 00:32:37 【问题描述】:

我想对单个列执行操作。 不幸的是,在我转换该列之后,它现在不再是它来自的数据框的一部分,而是一个 Column 对象。因此,它无法收集。

这是一个例子:

df = sqlContext.createDataFrame([Row(array=[1,2,3])])
df['array'].collect()

这会产生以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'Column' object is not callable

如何在单个列上使用collect() 函数?

【问题讨论】:

【参考方案1】:

火花 >= 2.0

从 Spark 2.0.0 开始,您需要明确指定 .rdd 才能使用 flatMap

df.select("array").rdd.flatMap(lambda x: x).collect()

火花

只需selectflatMap

df.select("array").flatMap(lambda x: x).collect()
## [[1, 2, 3]] 

【讨论】:

所以使用 select 而不是 subsetting 本质上会将其转换为单列数据框而不是 Column 没错。 Column 只是一个 SQL DSL 表达式,而不是一个独立的数据结构。 spark 2.0 中的等价物是什么?我看不到 flatMap 作为 DataFrame 上的一种方法 @ThatDataGuy 您现在需要明确传递.rdd。一旦它被包裹起来。 df.select("array").rdd.flatMap(lambda x: x).collect() 将数据帧转换为 rdd 会产生开销。尝试使用data = list(map(lambda x: x[0], df.select("array").collect())) 之类的方法来避免它使用普通 python 代码展平列表

以上是关于如何在 Spark 中收集单列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spark scala 中为单列创建数据框

Scala Spark - 如何减少在单列中包含多列的数据帧?

如何将 Spark Dataframe 列转换为字符串数组的单列

Spark将单列转换为数组

如何将列表数组合并到单列中并使其适合现有的数据框?

如何在加入(广播)和使用 Spark 收集之间进行选择