перепутал с группой искры - PullRequest
0 голосов
/ 27 августа 2018

Я новичок в scala & spark, я хочу отфильтровать несколько дублированных записей с условием в таблице улья, я выбрал spark.

Я знаком с kotlin, поэтому я использую kotlin для описания логики:

data class Bean(val id: Int, val name: String, val time: String)

val data = listOf(
        Bean(1, "1", "20180101 00:00:00"),
        Bean(1, "2", "20180101 00:00:01"),
        Bean(2, "3", "20180101 00:00:02"),
        Bean(2, "4", "20180101 00:00:03"),
        Bean(3, "5", "20180101 00:00:04")
)

val result = data.groupBy { it.id }.map { (_, v) -> v.maxBy { it.time } }

result.forEach { println(it)}

//result

Bean(id=1, name=2, time=20180101 00:00:01)
Bean(id=2, name=4, time=20180101 00:00:03)
Bean(id=3, name=5, time=20180101 00:00:04)

В улье много таблиц с разными столбцами, но все они имеют идентификатор и время, записи могут иметь одинаковый идентификатор, но разное время, мне просто нужно максимальное времята же самая запись идентификатора.

spark.read.table(s"$dbName.$tableName")
    .groupBy($"id") // get a RelationalGroupedDataset
    ...
}

когда я использую groupBy, я получаю результат RelationalGroupedDataset, я хочу знать, как делать дальше?или, может быть, это неправильный шаг, как мне поступить?

1 Ответ

0 голосов
/ 27 августа 2018

У вас есть несколько вариантов.

1). Создайте структуру, разверните ее и распакуйте.

Структуры сравниваются как кортежи для функции max, поэтому время должно идти в качестве первого поля.

spark.read.table(s"$dbName.$tableName")
    .withColumn("v", struct($"time", $"name"))
    .groupBy($"id").agg(max($"v"))
    .select($"id", $"v.name", $"v.time")

2). Используйте оконную функцию и найдите первую строку для каждой записи.

Я забыл точный синтаксис, но это что-то вроде следующего.

val w = Window.partitionBy($"id").orderBy($"time".desc)
spark.read.table(s"$dbName.$tableName")
    .withColumn($"num", row_number().over(w))
    .filter($"num" === 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...