我有一個csv文件:(customerId,orderId,花費)。我計算使用兩種方法每一位客戶的總支出:DataBrame with groupBy與RDD with reduceByKey
方法1:使用數據幀和GROUPBY
val df = ss.read
.option("header", false)
.option("inferSchema", true)
.csv("data.csv")
df
.groupBy("_c0")
.sum("_c2")
.collect()
方法2:採用RDD和reduceByKey
sc
.textFile("data.csv")
.map(parseLine)
.reduceByKey(_ + _)
.collect()
private def parseLine(line: String) = {
val fields = line.split(",")
(fields(0).toInt, fields(2).toFloat)
}
結果這兩種方法是相同的。然而,方法2總是比方法1更快(2倍)。
第一個問題:是因爲方法1使用了groupBy?如果是這樣,當我在筆記本電腦上運行時會發生什麼。即只有1個節點,即沒有洗牌成本?
這是我的火花會話配置
.master("local[*]")
第二個問題:我怎麼能修改方法1使用數據幀,同時保留類似的方法2出色的表現?
謝謝!
我已閱讀。但這裏的重點是我想使用DataFrame,而不是RDD,因爲提到的DataFrame文檔具有更好的性能。此外,輸入文件已經結構化的數據,這是有道理的使用數據幀/數據集,我是不是正確的? –