Spark的RDD.combineByKey()是否保留以前排序的DataFrame的顺序?

时间:2017-04-26 10:38:30

标签: apache-spark pyspark apache-spark-sql rdd

我在PySpark中做过这个:

  1. 使用DataFrame语句创建SELECT以获取按资产序列号和时间排序的资产数据。
  2. 使用DataFrame.map()DataFrame转换为RDD
  3. 使用RDD.combineByKey()整理每项资产的所有数据,并使用资产的序列号作为密钥。
  4. 问题:我是否可以确定每个资产的数据仍然会按照上一步产生的RDD按时间顺序排序?

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

1 个答案:

答案 0 :(得分:0)

  

我是否可以确定每个资产的数据仍将按照上一步产生的RDD的时间顺序排序?

你做不到。当您跨多个维度应用排序时(按资产序列号排序的数据,然后按时间),单个asset的记录可以分布在多个分区上。 combineByKey将需要随机播放,并且无法保证这些部分合并的顺序。

您可以尝试使用repartitionsortWithinPartitions(或its equivalent on RDDs):

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

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

或具有帧定义的窗口函数如下:

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

在Spark> = 2.0中,窗口函数可以与UserDefinedFunctions一起使用,所以如果您在Scala中编写自己的SQL扩展,那么可以完全跳过转换为RDD。