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