PySpark:数据帧分割成多个DataFrames不使用循环

问题描述:

您好我有一个数据帧,如图 -PySpark:数据帧分割成多个DataFrames不使用循环

ID  X  Y 

1  1234  284 

1  1396  179 

2  8620  178 

3  1620  191 

3  8820  828 

我想这个数据帧分成基于ID的多个DataFrames。因此,在这个例子中会有3个DataFrame。实现它的一种方法是在循环中运行过滤器操作。但是,我想知道它是否可以以更有效的方式完成。

+0

的[I如何可以分割数据帧与在SCALA和火花同一列值dataframes](可能的复制http://*.com/questions/31669308/how-can-i-split-a- dataframe-into-dataframes-with-same-column-values-in-scala-) –

+0

是的。但我正在寻找一个pyspark版本。 – sjishan

+0

如果列按分区存储,则可以创建更为优化的解决方案,然后我们可以在不同的集群中并行执行计算 –

#initialize spark dataframe 
df = sc.parallelize([ (1,1234,282),(1,1396,179),(2,8620,178),(3,1620,191),(3,8820,828) ]).toDF(["ID","X","Y"]) 

#get the list of unique ID values ; there's probably a better way to do this, but this was quick and easy 
listids = [x.asDict().values()[0] for x in df.select("ID").distinct().collect()] 
#create list of dataframes by IDs 
dfArray = [df.where(df.ID == x) for x in listids] 

dfArray[0].show() 
+---+----+---+ 
| ID| X| Y| 
+---+----+---+ 
| 1|1234|282| 
| 1|1396|179| 
+---+----+---+ 
dfArray[1].show() 
+---+----+---+ 
| ID| X| Y| 
+---+----+---+ 
| 2|8620|178| 
+---+----+---+ 

dfArray[2].show() 
+---+----+---+ 
| ID| X| Y| 
+---+----+---+ 
| 3|1620|191| 
| 3|8820|828| 
+---+----+---+ 
+0

您正在循环。我认为这与我正在寻找的最接近。 http://*.com/questions/41663985/spark-dataframe-how-to-efficiently-split-dataframe-for-each-group-based-on-same 但它是I/O时间关联它。 – sjishan

+0

如果你想为每个东西“获取某些东西”,将会出现一个固有的循环某处 –

+0

正确但是你可以将任务映射到不同的分区并获得DF列表。这正是我想要做的。 – sjishan