基于字段之一将 Scalding TypedPipe 输出到多个目录中的 SequenceFile
Outputting a Scalding TypedPipe to a SequenceFile in multiple directories based on one of the fields
我在 Hadoop 上使用 Scalding,我有一个 TypedPipe 形式的大型数据集,我希望根据其中一个数据字段以块的形式输出。
例如数据是 <category, field1, field2>
,我希望每个类别的数据存储在单独类别的 SequenceFile 中,例如outPath/cat1
、outPath/cat2
等。我想要一个 MapReduce 阶段(或避免循环)。
我在此处阅读了有关 TemplatedTsv
选项的信息:
How to bucket outputs in Scalding
这里:
How to output data with Hive-style directory structure in Scalding?
然而,这仅在您需要 Tsv 文件而不是 SequenceFile 时有效。
显然循环有效:
var category = 0L
for (category <- categories) {
data
.filter(_.category == category)
.map(t => (NullWritable.get, new BytesWritable(SerializationUtils.serialize(t))))
.write(WritableSequenceFile(outPath + "/" + category))
}
那么,是否有一种与 TemplateTsv
等效的方法,可以用于编写 SequenceFile,避免循环?
有 com.twitter.scalding.TemplatedSequenceFile 可以满足您的需要。它看起来就像 TemplateTsv,但输出到 SequenceFile
我在 Hadoop 上使用 Scalding,我有一个 TypedPipe 形式的大型数据集,我希望根据其中一个数据字段以块的形式输出。
例如数据是 <category, field1, field2>
,我希望每个类别的数据存储在单独类别的 SequenceFile 中,例如outPath/cat1
、outPath/cat2
等。我想要一个 MapReduce 阶段(或避免循环)。
我在此处阅读了有关 TemplatedTsv
选项的信息:
How to bucket outputs in Scalding
这里: How to output data with Hive-style directory structure in Scalding?
然而,这仅在您需要 Tsv 文件而不是 SequenceFile 时有效。
显然循环有效:
var category = 0L
for (category <- categories) {
data
.filter(_.category == category)
.map(t => (NullWritable.get, new BytesWritable(SerializationUtils.serialize(t))))
.write(WritableSequenceFile(outPath + "/" + category))
}
那么,是否有一种与 TemplateTsv
等效的方法,可以用于编写 SequenceFile,避免循环?
有 com.twitter.scalding.TemplatedSequenceFile 可以满足您的需要。它看起来就像 TemplateTsv,但输出到 SequenceFile