【问题标题】:What is the efficient way to sort Spark Dataset based on two column values?基于两列值对 Spark 数据集进行排序的有效方法是什么?
【发布时间】:2018-04-08 08:07:29
【问题描述】:

我有一个包含三列的大型数据集,格式如下:

col1   col2   col3
------------------
 a1     1      i1
 a1     1      i2
 a1     2      i3
 a3     2      i4
 a3     1      i5
 a2     3      i6
 a2     3      i7
 a2     1      i8

我写了以下内容:

   val datase2 = dataset.groupBy("col1","col2").agg(collect_list("col3").as("col3"))
        .sort("col1", "col2")
        .groupBy("col1").agg(collect_list("col2"), collect_list("col3"))
        .toDF("col1", "col2", "col3").as[(String, Array[String], Array[String])]

为了从结果数据集中获取 col2 的不同值,我编写了以下代码:

dataset2.select("col3").distinct().show()

上面的代码适用于小数据集,但对于大数据集,我得到了以下类型的结果(只是为了说明结果数据集不一致的情况):

col1     col2           col3
-----------------------------------
a1     [1, 2]      [[i1, i2], [i3]]
a2     [3, 1]      [[i6, i7], [i8]]
a3     [2, 1]      [[i4], [i5]]

正如我在sort("col1", "col2") 所做的那样,输出应该是

col1     col2           col3
-----------------------------------
a1     [1, 2]      [[i1, i2], [i3]]
a2     [1, 3]      [[i8], [i6, i7]]
a3     [1, 2]      [[i5], [i4]]

col2 将按排序顺序排列,col2col3 的值将根据它们的数组索引保持一致。例如,上述数据集的最后一行将是

 col2           col3
-------------------------
[1, 2]      [[i5], [i4]]

但不是

 col2           col3
-------------------------
[1, 2]      [[i4], [i5]]

我怎样才能实现我的目标?

【问题讨论】:

    标签: apache-spark apache-spark-sql spark-dataframe apache-spark-dataset


    【解决方案1】:

    使用struct 合并记录并使用sort_array

    dataset
      .groupBy($"col1")
      .agg(sort_array(collect_list(struct($"col2", $"col3"))).alias("data"))
      .select($"col1", $"data.col2", $"data.col3")
    

    积分转到user6910411) this answer

    【讨论】:

    • 从您的回答中得到一个想法。谢谢。
    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多