我在PySpark中做过这个:
DataFrame
语句创建SELECT
以获取按资产序列号和时间排序的资产数据。DataFrame.map()
将DataFrame
转换为RDD
。RDD.combineByKey()
整理每项资产的所有数据,并使用资产的序列号作为密钥。 问题:我是否可以确定每个资产的数据仍然会按照上一步产生的RDD
按时间顺序排序?
时间顺序对我来说至关重要(我需要在每个资产的数据的移动时间窗口内计算统计数据)。当RDD.combineByKey()
将来自Spark集群中不同节点的数据组合到一个给定密钥时,该密钥的数据中是否保留了任何顺序?或者来自不同节点的数据是否按给定密钥的特定顺序组合?
答案 0 :(得分:0)
我是否可以确定每个资产的数据仍将按照上一步产生的RDD的时间顺序排序?
你做不到。当您跨多个维度应用排序时(按资产序列号排序的数据,然后按时间),单个asset
的记录可以分布在多个分区上。 combineByKey
将需要随机播放,并且无法保证这些部分合并的顺序。
您可以尝试使用repartition
和sortWithinPartitions
(或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。