[英]Apache Spark groupByKey -> saveAsTextfile
我有一個巨大的XML文件,其中包含許多未排序的行:
<row>
<field name="f1">group</field>
<field name="f2">number</field>
<field name="f3">number2</field>
</row>
我想使用spark將具有不同編號的每個組(f1)提取到單獨的文件中。
現在,我嘗試首先使用map,distinct和collect提取所有組(〜50個),然后遍歷該組數組。 使用原始的RDD,我篩選與當前組saveToTextFile匹配的所有行。 -有效,但是我很確定這種方式效率最低。
因此,我將我的xml導入器更改為返回(f1,(f2,f3)),並嘗試執行以下操作:
rdd.groupByKey(numPartitions).mapPartitions(part => {
part.map(data => {
val group = data._1
val numbers = data._2
...
}
這就是我得到的結果,因為既然數字現在是Iterable [(String,String)],而不是RDD。
我的想法基本上是(偽代碼):
rdd.groupByKey(numPartitions).map((group, numbers) => {
numbers.distinct.map(OutputFormatter(_)).
saveAsTextFile(s"$target$group")
}
這里的numPartitions應該與工作人員的大小匹配,以便每個工作人員有一個組(我也想在此處對行為進行基准測試,但這是舊的)
因為groupByKey需要首先收集數據,所以數字不能在此處為RDD是否正確? 如果沒有,我想念什么?
此操作是否有通用的最佳實踐? 我是火花/ hadoop / etc的新手
謝謝。
我可以想到以下方法,我想它的實質與使用過濾的原始解決方案類似,只是我們沒有明確收集到數組。 這接近您的需求嗎?
def extractGroup(row: Row) = ???
def extractNumbers(row: Row) = ???
val keyed = rdd.keyBy(extractGroup _)
keyed
.map { case (group, row) => group }
.distinct
.foreach { group =>
keyed
.filter { _._1 == group }
.map { case (_, row) => extractNumbers(row) }
.distinct
.map(OutputFormatter(_))
.saveAsTextFile(???)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.