gpt4 book ai didi

scala - 在 Spark SQL 中的一个查询中使用多个 collect_list

转载 作者:行者123 更新时间:2023-12-04 10:23:46 24 4
gpt4 key购买 nike

我有以下数据框 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")

我的问题是,是否 productrating在聚合数组中相互匹配吗?即是否 productrating来自同一行的集合在聚合数组中具有相同的索引。

更新:
从 Spark 2.0.0 开始,可以做 collect_list在结构类型上,所以我们可以做一个 collect_list在组合列上。但是对于2.0.0之前的版本,只能使用 collect_list在原始类型上。

最佳答案

我相信没有明确保证所有数组都具有相同的顺序。 Spark SQL 使用多种优化,并且在某些条件下无法保证所有聚合都在同一时间进行调度(一个示例是使用 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

关于scala - 在 Spark SQL 中的一个查询中使用多个 collect_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407514/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com