我有以下Dataframe data
:
root
|-- userId: string
|-- product: string
|-- rating: double
以及以下查询:
val result = sqlContext.sql("select userId, collect_list(product), collect_list(rating) from data group by userId")
我的问题是,是吗 product
以及 rating
在聚合数组中是否相互匹配?也就是说 product
以及 rating
来自同一行的成员在聚合数组中具有相同的索引。
更新:从spark 2.0.0开始,你可以 collect_list
所以我们可以做一个 collect_list
在组合柱上。但对于2.0.0之前的版本,只能使用 collect_list
在基元类型上。
1条答案
按热度按时间kx5bkwkv1#
我认为没有明确的保证所有数组都具有相同的顺序。sparksql使用多种优化,在某些情况下,不能保证所有聚合都是同时调度的(一个例子是使用
DISTINCT
). 由于交换(洗牌)的结果是不确定的顺序,理论上可能顺序会不同。因此,虽然它应该在实践中工作,但它可能有风险,并引入一些难以检测的错误。
如果spark 2.0.0或更高版本,则可以使用
collect_list
:如果使用早期版本,可以尝试使用显式分区和顺序: