2017-04-26 111 views
0

我在PySpark做到了这一点:使用Spark的RDD.combineByKey()是否保留先前排序的DataFrame的顺序?

  1. 创建一个DataFrame一个SELECT声明获得通过资产的序列号,然后按时间排序的资产数据。
  2. 使用DataFrame.map()DataFrame转换为RDD
  3. 使用RDD.combineByKey()来整理每个资产的所有数据,使用该资产的序列号作为关键字。

问:我可以肯定的是每项资产的数据仍然会在RDD从最后一步产生的时间顺序进行排序?

时间顺序对我至关重要(我需要计算每个资产的数据移动时间窗口的统计数据)。当RDD.combineByKey()将来自Spark群集中不同节点的数据组合为给定密钥时,是否保留该密钥数据中的任何顺序?或者,对于给定的密钥,来自不同节点的数据是否以特定顺序组合?

回答

0

我可以确定每个资产的数据仍然会按照最后一步所产生的RDD中的时间顺序排序吗?

你不行。当您在多个维度上应用排序(数据按资产序号排序,然后时间)时,单个asset的记录可以分布在多个分区中。 combineByKey将需要洗牌,并且不保证这些部件组合的顺序。

可以与repartitionsortWithinPartitions(或its equivalent on RDDs)尝试:

df.repartition("asset").sortWithinPartitions("time") 

​​

或窗函数与帧定义如下:

w = Window.partitionBy("asset").orderBy("time") 

在火花> = 2.0窗口函数可以与一起使用所以如果你在Scala中编写自己的SQL扩展可以完全跳过到RDD的转换。

相关问题