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 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |