2

在 Hadoop 中,我有一个看起来像这样的 Reducer,用于将数据从先前的映射器转换为一系列不InputFormat兼容类型的文件。

protected void setup(Context context) {
    LocalDatabase ld = new LocalDatabase("localFilePath");
}

protected void reduce(BytesWritable key, Text value, Context context) {
    ld.addValue(key, value)
}

protected void cleanup(Context context) {
    saveLocalDatabaseInHDFS(ld);
}

我正在用 Pig 重写我的应用程序,但无法弄清楚如何在 Pig UDF 中完成此操作,因为没有清理功能或其他任何东西来表示 UDF 何时完成运行。这怎么能在猪身上做到呢?

4

2 回答 2

2

我会说你需要编写一个StoreFuncUDF,包装你自己的自定义 OutputFormat - 然后你就可以在输出格式的RecordWriter.close()方法中关闭。

但是,这将为每个 reducer 在 HDFS 中创建一个数据库,因此如果您希望将所有内容都放在一个文件中,则需要使用单个 reducer 运行或运行辅助步骤以将数据库合并在一起。

于 2013-03-22T10:31:54.017 回答
1

如果您希望在 UDF 结束时运行某些内容,请使用 finish() 调用。这将在您的 UDF 处理完所有记录后调用。每个 mapper 或 reducer 都会调用一次,与 reducer 中的清理调用相同。

于 2013-03-22T15:56:40.893 回答