我有以下数据样本数据,但在现实生活中这个数据集很大。
A B 1-1-2018 10
A B 2-1-2018 20
C D 1-1-2018 15
C D 2-1-2018 25
我需要使用日期对上述数据进行分组并生成 key 对值
1-1-2018->key
-----------------
A B 1-1-2018 10
C D 1-1-2018 15
2-1-2018->key
-----------------
A B 2-1-2018 20
C D 2-1-2018 25
谁能告诉我如何在 Spark 中以最佳优化方式做到这一点(如果可能的话使用 java)
最佳答案
不是Java,但看看上面的代码,您似乎想按 Key 递归地将数据帧设置为子组。我知道如何做到这一点的最好方法是使用 while 循环,但这并不是地球上最简单的方法。
//You will also need to import all DataFrame and Array data types in Scala, don't know if you need to do it for Java for the below code.
//Inputting your DF, with columns as Value_1, Value_2, Key, Output_Amount
val inputDF = //DF From above
//Need to get an empty DF, I just like doing it this way
val testDF = spark.sql("select 'foo' as bar")
var arrayOfDataFrames = Array[DataFrame] = Array(testDF)
val arrayOfKeys = inputDF.selectExpr("Key").distinct.rdd.map(x=>x.mkString).collect
var keyIterator = 1
//Need to overwrite the foo bar first DF
arrayOfDataFrames = Array(inputDF.where($""===arrayOfKeys(keyIterator - 1)))
keyIterator = keyIterator + 1
//loop through find the key and place it into the DataFrames array
while(keyIterator <= arrayOfKeys.length) {
arrayOfDataFrames = arrayOfDataFrames ++ Array(inputDF.where($"Key"===arrayOfKeys(keyIterator - 1)))
keyIterator = keyIterator + 1
}
在命令末尾,您将有两个相同长度的数据帧和匹配的键的数组。这意味着如果您选择键的第三个元素,它将与数据帧的第三个元素匹配。
由于这不是 Java 并且不能直接回答您的问题,因此这是否至少有助于将您推向可能有帮助的方向(我在 Spark Scala 中构建了它)。
关于java - 如何在spark中进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57873011/