Spark Column 将所有列表合并为 1 个单个列表

Posted

技术标签:

【中文标题】Spark Column 将所有列表合并为 1 个单个列表【英文标题】:Spark Column merging all list into 1 single list 【发布时间】:2019-12-11 08:51:43 【问题描述】:

我希望下面的列合并到一个列表中以进行 n-gram 计算。我不确定如何将一列中的所有列表合并为一个。

+--------------------+
|              author|
+--------------------+
|       [Justin, Lee]|
|[Chatbots, were, ...|
|[Our, hopes, were...|
|[And, why, wouldn...|
|[At, the, Mobile,...|
+--------------------+

(编辑)更多信息: 我希望将其作为 spark df 列和所有单词,包括单个列表中的重复单词。数据有点大,所以我想尽量避免使用 collect 之类的方法

【问题讨论】:

您想将信息保留为 Spark DataFrame 吗? DataFrame 是否只有几行长,就像您的示例中一样?你想保留重复的单词吗?请提供更多信息。 好的,用更多信息更新了问题 【参考方案1】:

OP 想要将所有数组/列表聚合到第一行。

values = [(['Justin','Lee'],),(['Chatbots','were'],),(['Our','hopes','were'],),
          (['And','why','wouldn'],),(['At','the','Mobile'],)]
df = sqlContext.createDataFrame(values,['author',])
df.show()
+------------------+
|            author|
+------------------+
|     [Justin, Lee]|
|  [Chatbots, were]|
|[Our, hopes, were]|
|[And, why, wouldn]|
| [At, the, Mobile]|
+------------------+

这一步就够了。

from pyspark.sql import functions as F
df = df.groupby().agg(F.collect_list('author').alias('list_of_authors'))
df.show(truncate=False)
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|list_of_authors                                                                                                                                         |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
|[WrappedArray(Justin, Lee), WrappedArray(Chatbots, were), WrappedArray(Our, hopes, were), WrappedArray(And, why, wouldn), WrappedArray(At, the, Mobile)]|
+--------------------------------------------------------------------------------------------------------------------------------------------------------+

【讨论】:

您忘记将该列表放回 spark 数据框列。还有很多代码行和迭代使它变得复杂 我的理解是他想要一个python列表,还是我弄错了? 我想他自己将能够进一步澄清,也不建议使用收集,直到您确定该机器不会耗尽驱动程序内存 No not a python list a spark dataframe column 但是您使用“收集”方法不会使集群上的驱动程序内存过载吗? 那么,一个 sparkDF 列只有一行包含列表,对吧?【参考方案2】:

DataFrames 与其他分布式数据结构一样,不可迭代,只能通过专用的高阶函数和/或 SQL 方法访问

假设你的数据框是 DF1,输出是 DF2

你需要类似的东西:

values = [(['Justin', 'Lee'],), (['Chatbots', 'were'],), (['Our', 'hopes', 'were'],),
          (['And', 'why', 'wouldn'],), (['At', 'the', 'Mobile'],)]
df = spark.createDataFrame(values, ['author', ])
df.agg(F.collect_list('author').alias('author')).show(truncate=False)

如果有效,请点赞

【讨论】:

AssertionError: col 应该是 Column 抛出这个错误 OP 要求不要收集到驱动程序,您通过将其全部放入 list1 来执行此操作。

以上是关于Spark Column 将所有列表合并为 1 个单个列表的主要内容,如果未能解决你的问题,请参考以下文章

将列表的 spark DF 列拆分为单独的列

将列表中的 n 个 DF 合并到单个 DataFrame - Scala

使用 Spark Scala 进行区间合并

带有列列表的 Spark 选择 Scala

将列表中的多个图像合并为 PDF

Spark-灵魂拷问的5个问题