我是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)
配置单元中有很多表具有不同的列,但是它们都具有“ id”和“ time”,记录可能具有相同的id但时间不同,我只需要相同的id记录的最大时间。 / p>
spark.read.table(s"$dbName.$tableName")
.groupBy($"id") // get a RelationalGroupedDataset
...
}
当我使用groupBy时,我得到一个RelationalGroupedDataset结果,我想知道下一步该怎么做?还是这是错误的步骤,我该怎么办?
答案 0 :(得分:0)
您在那里有两个选择。
1)。制作一个结构,将其最大化,然后解压缩。
结构像元组一样被比较以实现最大功能,因此时间必须放在第一位。
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)