加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:51:59 所属栏目:安全 来源:网络整理
导读:我有以下数据帧数据: root |-- userId: string |-- product: string |-- rating: double 以及以下查询: val result = sqlContext.sql("select userId,collect_list(product),collect_list(rating) from data group by userId") 我的问题是,聚合数组中的产
我有以下数据帧数据:

root
 |-- userId: string 
 |-- product: string 
 |-- rating: double

以及以下查询:

val result = sqlContext.sql("select userId,collect_list(product),collect_list(rating) from data group by userId")

我的问题是,聚合数组中的产品和评级是否相互匹配?也就是说,产品和来自同一行的评级在聚合数组中是否具有相同的索引.

更新:
从Spark 2.0.0开始,可以对struct类型执行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(rating)
FROM tmp
GROUP BY userId

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读