簡體   English   中英

Apache Spark groupByKey-> saveAsTextfile

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM