PySpark:从数据框列表创建 RDD
Posted
技术标签:
【中文标题】PySpark:从数据框列表创建 RDD【英文标题】:PySpark: Creating RDD from List of Dataframes 【发布时间】:2017-04-09 20:31:19 【问题描述】:我无法从 pyspark 数据帧列表创建 RDD,如下所示:
l = [('Alice', 1)]
df = sqlContext.createDataFrame(l)
m = [('bob', 2)]
df2 = sqlContext.createDataFrame(m)
df_list = [df, df2]
sc.parallelize(df_list)
我得到的错误是:
Py4JError: An error occurred while calling o85.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
在parallelize
电话中。它适用于一个简单的列表,例如[1,2,3]
,但是当列表的元素变成一个数据框时,它似乎失败了......请指教。
我有一个时间序列数据框,可以按列的id
分组。由于我需要对每个时间序列数据进行一些计算,我的想法是通过id
将数据帧拆分为多个数据帧,并将它们中的每一个都设为列表中的一个元素,因此当我从该列表创建 RDD 时,我可以并行对数据帧进行计算。
我使用的是 Spark 1.6。 提前致谢!
【问题讨论】:
【参考方案1】:只有当您的数据框具有相同的架构时,这才有效。
df = df.unionAll(df2)
rdd = df.rdd()
【讨论】:
谢谢,对于我的其他数据框,它们确实具有相同的架构,但仍然无法正常工作。另外,我想做的是从数据框列表中创建一个 RDD。我想并行化在数据帧上完成的计算。这与将原始数据帧的每一行都变成 RDD 的一个元素不同,这有意义吗? 好吧,DataFrame 已经是分布式结构,如果您想重新分配您的数据,您必须将您的DataFrame
转换为并行化可以采用的结构:df = sc.parallelize(df.collect()+df2.collect())
。我认为在这种情况下,联合是更有效的方式。
尽管 collect
做了我想做的事,但我有数百万个数据帧,我需要对每个数据帧进行一些聚合,而且花费的时间太长。
你的数据框的来源是什么?
这是一张大表中的一堆锻炼数据,其中每个锻炼 id 大约有 500 个数据点。来自一个名为 endomondo 的网站以上是关于PySpark:从数据框列表创建 RDD的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:从列表的 RDD 创建一个火花数据框,其中列表的某些元素是对象
pyspark 从 spark 数据框列创建一个不同的列表并在 spark sql where 语句中使用
从列表中创建一个 pyspark 数据框列,其中列表的长度与数据框的行数相同