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保证单调增加且唯一,但不是连续的.