【问题标题】:Use more than one collect_list in one query in Spark SQL在 Spark SQL 的一个查询中使用多个 collect_list
【发布时间】:2017-03-17 09:25:29
【问题描述】:

我有以下数据框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。但是对于 pre 2.0.0 版本,只能在原始类型上使用collect_list

【问题讨论】:

    标签: scala apache-spark hive apache-spark-sql


    【解决方案1】:

    我相信没有明确的保证所有数组都将具有相同的顺序。 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
    

    【讨论】:

    • 如何将cogroup 用于大型数据集,例如当我使用collect() 时,它会抛出内存不足异常rdd1 = rdd2.cogroup(rdd3).collect。你能帮忙解决这个问题吗[stackoverflow.com/questions/47180307/….可以分区帮助我是新手来激发任何帮助来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    相关资源
    最近更新 更多