問題的提出
在進(jìn)行數(shù)據(jù)處理時,我們經(jīng)常遇到這樣的需求:把同一個key的數(shù)據(jù)寫到同一個文件/文件夾中。
這樣,在進(jìn)行后續(xù)的處理,比如查看某個key占的磁盤空間,單獨處理某個key的數(shù)據(jù)等都會非常方便。
解決方案
通過來解決這個問題很方便。方案就是:通過該key進(jìn)行分區(qū),這樣同一個key的值就都分配到一個分區(qū)中了。
val people_rdd = sc.parallelize(Seq((1, "alice"), (1, "bob"), (2, "charlie")))

val people_df = people_rdd.toDF("number", "name")
people_df.write.partitionBy("number").text("people")
或則寫成其他文件格式:
people_df.write.partitionBy("number").json("people-json")
people_df.write.partitionBy("number").parquet("people-parquet")

通過來實現(xiàn)該功能非常方便,其實就是按照某個字段先分區(qū)文件夾里面的數(shù)字都是什么,若要排序也可以按分區(qū)進(jìn)行排序,然后再按規(guī)定的格式寫入即可。
要注意的是,寫入的分區(qū)數(shù)據(jù)會按分區(qū)創(chuàng)建一個文件夾,同一個分區(qū)的數(shù)據(jù)在同一個文件夾中。若分區(qū)數(shù)太多,則創(chuàng)建的分區(qū)文件夾也會很多。
另外,在寫數(shù)據(jù)的時候也可以對數(shù)據(jù)先進(jìn)行排序文件夾里面的數(shù)字都是什么,這樣就得到了一個排好序的數(shù)據(jù)文件。
小結(jié)
本文講述了如何把一個同一個key的文件寫入到同一個文件/文件夾的方法。