collect_list()是否维护行的相对排序?

Mar*_*ace 13 scala apache-spark apache-spark-sql

想象一下,我有以下DataFrame df:

+---+-----------+------------+
| id|featureName|featureValue|
+---+-----------+------------+
|id1|          a|           3|
|id1|          b|           4|
|id2|          a|           2|
|id2|          c|           5|
|id3|          d|           9|
+---+-----------+------------+
Run Code Online (Sandbox Code Playgroud)

想象一下,我跑:

df.groupBy("id")
  .agg(collect_list($"featureIndex").as("idx"),
       collect_list($"featureValue").as("val"))
Run Code Online (Sandbox Code Playgroud)

我是否保证会将"idx"和"val"汇总并保持相对顺序?即

GOOD                   GOOD                   BAD
+---+------+------+    +---+------+------+    +---+------+------+
| id|   idx|   val|    | id|   idx|   val|    | id|   idx|   val|
+---+------+------+    +---+------+------+    +---+------+------+
|id3|   [d]|   [9]|    |id3|   [d]|   [9]|    |id3|   [d]|   [9]|
|id1|[a, b]|[3, 4]|    |id1|[b, a]|[4, 3]|    |id1|[a, b]|[4, 3]|
|id2|[a, c]|[2, 5]|    |id2|[c, a]|[5, 2]|    |id2|[a, c]|[5, 2]|
+---+------+------+    +---+------+------+    +---+------+------+
Run Code Online (Sandbox Code Playgroud)

注意:例如,它是坏的,因为id1 [a,b]应该与[3,4](而不是[4,3])相关联.对于id2也是如此

Jac*_*ski 11

我认为你可以依赖"他们的相对顺序",因为Spark 按顺序依次遍历行(如果没有明确需要,通常不会重新排序行).

如果您关心订单,请在执行之前使用struct函数合并这两列groupBy.

struct(colName:String,colNames:String*):Column创建一个组成多个输入列的新结构列.

您还可以使用monotonically_increasing_id函数对记录进行编号,并使用它与其他列配对(可能使用struct):

monotonically_increasing_id():列生成单调递增的64位整数的列表达式.

生成的ID保证单调增加且唯一,但不是连续的.