Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 基于两列值对Spark数据集排序的有效方法是什么?_Apache Spark_Apache Spark Sql_Spark Dataframe_Apache Spark Dataset - Fatal编程技术网

Apache spark 基于两列值对Spark数据集排序的有效方法是什么?

Apache spark 基于两列值对Spark数据集排序的有效方法是什么?,apache-spark,apache-spark-sql,spark-dataframe,apache-spark-dataset,Apache Spark,Apache Spark Sql,Spark Dataframe,Apache Spark Dataset,我有一个三列的大型数据集,格式如下: 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"

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

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])]
dataset2.select("col3").distinct().show()
为了从结果数据集中获取
col2
的不同值,我编写了以下代码:

   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])]
dataset2.select("col3").distinct().show()
上面的代码适用于小数据集,但对于大数据集,我得到了以下类型的结果(只是为了说明不一致的结果数据集的场景):

正如我所做的那样,输出应该是

col1     col2           col3
-----------------------------------
a1     [1, 2]      [[i1, i2], [i3]]
a2     [1, 3]      [[i8], [i6, i7]]
a3     [1, 2]      [[i5], [i4]]
col2
将按顺序排序,
col2
col3
的值将根据其数组索引保持一致。例如,上面数据集的最后一行是

 col2           col3
-------------------------
[1, 2]      [[i5], [i4]]
但不是

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

如何实现我的目标?

使用
struct
组合记录并使用
sort\u array

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

学分为。

从您的答案中得到了一个想法。谢谢