我在PySpark中这样做过:
DataFrame
语句创建一个SELECT
,以获取按资产序列号排序的资产数据,然后按时间排序。DataFrame.map()
将DataFrame
转换为RDD
。RDD.combineByKey()
整理每个资产的所有数据,使用资产的序列号作为密钥。问题:,我能确定每个资产的数据仍然会在最后一步的RDD
中按时间顺序排序吗?
时间顺序对我来说是至关重要的(我需要在每个资产的移动时间窗口上计算统计数据)。当RDD.combineByKey()
为给定的密钥组合来自火花集群中不同节点的数据时,该键的数据中是否保留了任何顺序?或者,对于给定的密钥,来自不同节点的数据是否按特定顺序合并?
发布于 2017-04-26 13:59:39
我是否可以确定每个资产的数据仍将按RDD中的时间顺序排序,这是最后一步的结果?
你不能。当您跨多个维度(按资产序列号和时间排序的数据)应用排序时,单个asset
的记录可以跨多个分区传播。combineByKey
将需要一次洗牌,并且不能保证组合这些部件的顺序。
您可以尝试使用repartition
和sortWithinPartitions
(或RDDs
):
df.repartition("asset").sortWithinPartitions("time")
或
df.repartition("asset").sortWithinPartitions("asset", "time")
或具有框架定义的窗口功能如下:
w = Window.partitionBy("asset").orderBy("time")
在SparkSQL2.0中,>= 2.0窗口函数可以与UserDefinedFunctions
一起使用,因此,如果您能够在Scala中编写自己的UserDefinedFunctions
扩展,就可以完全跳过转换到UserDefinedFunctions
的过程。
https://stackoverflow.com/questions/43631820
复制相似问题