Проблема: у меня проблема с отображением наиболее распространенного значения ключа в искре (с использованием scala). Я сделал это с помощью RDD, но не знаю, как это сделать эффективно с DF / DS (sparksql)
набор данных похож на
key1 = value_a
key1 = value_b
key1 = value_b
key2 = value_a
key2 = value_c
key2 = value_c
key3 = value_a
После искрового преобразования и доступа на выходе должен быть каждый ключ со своим общим значением
Вывод
key1 = valueb
key2 = valuec
key3 = valuea
Пробовали до сих пор:
RDD
Я попытался сопоставить и уменьшить группу (key,value),count
в RDD, и это создает логику, но я не могу перевести это в sparksql (DataFrame / Dataset) (так как я хочу минимальное перемешивание по сети)
Вот мой код для RDD
val data = List(
"key1,value_a",
"key1,value_b",
"key1,value_b",
"key2,value_a",
"key2,value_c",
"key2,value_c",
"key3,value_a"
)
val sparkConf = new SparkConf().setMaster("local").setAppName("example")
val sc = new SparkContext(sparkConf)
val lineRDD = sc.parallelize(data)
val pairedRDD = lineRDD.map { line =>
val fields = line.split(",")
(fields(0), fields(2))
}
val flatPairsRDD = pairedRDD.flatMap {
(key, val) => ((key, val), 1)
}
val SumRDD = flatPairsRDD.reduceByKey((a, b) => a + b)
val resultsRDD = SumRDD.map{
case ((key, val), count) => (key, (val,count))
}.groupByKey.map{
case (key, valList) => (name, valList.toList.sortBy(_._2).reverse.head)
}
resultsRDD.collect().foreach(println)
DataFrame, использование окон: я пытаюсь с Window.partitionBy("key", "value")
агрегировать count over the window
. и thn sorting
и agg()
соответственно