Каков эффективный способ сортировки набора данных Spark на основе значений двух столбцов?

avatar
Abir Chokraborty
7 апреля 2018 в 23:06
779
1
1

У меня есть большой набор данных из трех столбцов в следующем формате:

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 будут отсортированы, а значения col2 и col3 будут согласованы на основе их индекса массива. Например, последняя строка приведенного выше набора данных будет

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

но не

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

Как я могу достичь своей цели?

Источник

Ответы (1)

avatar
Alper t. Turker
7 апреля 2018 в 23:47
2

Объедините записи, используя struct и используйте sort_array:

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

Спасибо за этот ответ пользователю 6910411).

Abir Chokraborty
8 апреля 2018 в 01:47
0

Получил идею из вашего ответа. Спасибо.