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 个单个列表的主要内容,如果未能解决你的问题,请参考以下文章