在sparksql的一个查询中使用多个collect\u列表

piv4azn7  于 2021-06-28  发布在  Hive
关注(0)|答案(1)|浏览(270)

我有以下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 在基元类型上。

kx5bkwkv

kx5bkwkv1#

我认为没有明确的保证所有数组都具有相同的顺序。sparksql使用多种优化,在某些情况下,不能保证所有聚合都是同时调度的(一个例子是使用 DISTINCT ). 由于交换(洗牌)的结果是不确定的顺序,理论上可能顺序会不同。
因此,虽然它应该在实践中工作,但它可能有风险,并引入一些难以检测的错误。
如果spark 2.0.0或更高版本,则可以使用 collect_list :

SELECT userId, collect_list(struct(product, rating)) FROM data GROUP BY userId

如果使用早期版本,可以尝试使用显式分区和顺序:

WITH tmp AS (
  SELECT * FROM data DISTRIBUTE BY userId SORT BY userId, product, rating
)
SELECT userId, collect_list(product), collect_list(rating)
FROM tmp
GROUP BY userId

相关问题