如何在map / reduce中执行ETL

时间:2011-01-03 14:04:13

标签: hadoop mapreduce

如果我必须逐行将文本文件转换为另一个文本文件,我们如何设计mapper / reducer。

我写了一个简单的map / reduce程序,它做了一个小的转换,但下面的细节要求更详细一点:

  • 文件通常是这样构造的 - 第一行包含以逗号分隔的列名列表。第二行和其余行指定列
  • 的值
  • 在某些行中,可能缺少尾随列值ex:如果有15列,则可能仅为前10列指定值。
  • 我有大约5个输入文件,我需要将其转换并聚合到一个文件中。转换特定于5个输入文件中的每一个。
  • 如何将文件名等上下文信息传递给mapper / reducer程序?
  • 转换特定于列,因此如何记住第一行中提到的列,然后关联并转换行中的值?

2 个答案:

答案 0 :(得分:3)

将文件拆分成行,并行转换(映射)每一行,将生成的行连接(缩小)到一个文件中?

答案 1 :(得分:1)

您不能依赖第一行中的列信息。如果您的文件大于HDFS块,则您的文件将被分成多个拆分,每个拆分交给不同的映射器。在这种情况下,只有接收第一个分割的映射器才会收到带有列信息的第一行,其余的则不会。

我建议将文件特定的元数据传递到单独的文件中,并将其作为辅助数据进行分发。 mapper或reducer任务可以读取元数据文件。

通过Hadoop Context对象,您可以获取映射器正在处理的文件的名称。在所有这些之间,我认为您拥有所引用的所有上下文信息,并且您可以进行文件特定的转换。即使不同文件的转换逻辑不同,映射器输出也需要具有相同的格式。

如果使用reducer,可以将reducer的数量设置为1,以强制所有输出聚合为一个文件。