簡體   English   中英

使用scalding讀取多個文件並輸出SINGLE文件

[英]Read multiple files using scalding and output a SINGLE file

我這幾天遇到了一個問題,我正在嘗試使用scalding從多個文件中讀取並使用單個文件創建輸出。 我的代碼是這樣的:

def getFilesSource (paths: Seq[String]) = {
    new MultipleTextLineFiles(paths: _*) {
      override protected def createHdfsReadTap(hdfsMode: Hdfs): Tap[JobConf, _, _] =  {
        val taps = goodHdfsPaths(hdfsMode).toList.map {
          path => CastHfsTap (new Hfs (hdfsScheme, path, sinkMode))
        }

        taps.size match {
          case 0 => {
            CastHfsTap (new Hfs(hdfsScheme, hdfsPaths.head, sinkMode))
          }
          case 1 => taps.head
          case _ => new ScaldingMultiSourceTap(taps)
        }
      }
    }
  }

但是當我運行這段代碼時,它會將我的輸出分成很多文件,但里面的數據很少:只有幾K.相反,我希望能夠將所有輸出文件聚合成一個。

我的燙金代碼是:

val source = getFilesSource(mapped) // where mapped is a Sequence of valid HDFS paths (Seq [String])

TypedPipe.from(source).map(a => Try{
  val json = JSON.parseObject(a)
  (json.getInteger("prop1"), json.getInteger("prop2"), json.getBoolean("prop3"))
}.toOption).filter(a => a.nonEmpty)
  .map(a => a.get)
  .filter(a => !a._3)
  .map (that => MyScaldingType (that._1, that._2))
  .write(MyScaldingType.typedSink(typedArgs))

我想我必須覆蓋ScaldingMultiSourceTap類型的“sourceConfInit”方法,但我不知道在里面寫什么...

您可以使用groupAll將所有地圖輸出(作業是僅地圖作業)發送到單個reducer,考慮到數據很小,然后執行寫入。 輸出將寫入單個文件。

.
.
.
.filter(a => !a._3)
.map (that => MyScaldingType (that._1, that._2))
.groupAll
.write(MyScaldingType.typedSink(typedArgs))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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