Scala collect_list()是否保持行的相对顺序?

Scala collect_list()是否保持行的相对顺序?,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,假设我有以下数据帧df: +---+-----------+------------+ | id|featureName|featureValue| +---+-----------+------------+ |id1| a| 3| |id1| b| 4| |id2| a| 2| |id2| c| 5| |id3| d|

假设我有以下数据帧df:

+---+-----------+------------+
| id|featureName|featureValue|
+---+-----------+------------+
|id1|          a|           3|
|id1|          b|           4|
|id2|          a|           2|
|id2|          c|           5|
|id3|          d|           9|
+---+-----------+------------+
想象一下我在跑步:

df.groupBy("id")
  .agg(collect_list($"featureIndex").as("idx"),
       collect_list($"featureValue").as("val"))
我是否保证将“idx”和“val”聚合并保持它们的相对顺序?i、 e

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]|
+---+------+------+    +---+------+------+    +---+------+------+
注意:例如,这是不好的,因为对于id1[a,b]应该与[3,4](而不是[4,3])关联。id2也是一样,我认为您可以依赖于“它们的相对顺序”,因为Spark会按顺序逐个遍历行(如果没有明确需要,通常不会重新排序行)

如果您关心顺序,请在执行
groupBy
之前使用函数合并这两列

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

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

单调递增的\u id():列生成单调递增的64位整数的列表达式

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


因此,Spark DataFrame将数据处理“水平”分布,而不是“垂直”分布。i、 e.一个执行者将始终接收整行,而不是其中的几列?是的。行始终全部位于单个执行器/节点上。