如何在Map/Reduce中执行ETL

3
如果我必须逐行将文本文件转换为另一个文本文件,我们应该如何设计 mapper/reducer?
我写了一些简单的 map/reduce 程序,但要求有点更加详细,请参考以下说明:
- 文件通常是这样结构化的——第一行包含用逗号分隔的列名列表。第二行和其余行指定相对于列的值。 - 在某些行中,尾部列的值可能会丢失。例如,如果有 15 列,那么仅为前 10 列指定值。 - 我有大约 5 个输入文件需要转换并聚合到一个文件中。每个输入文件的转换都是特定的。 - 如何将上下文信息(如文件名)传递给 mapper/reducer 程序? - 转换是特定于列的,那么如何记住第一行中提到的列,然后关联并转换行中的值?

3
如果您希望得到相关的答案,就需要提供更多细节。将文本文件转换为另一个文本文件几乎符合大多数 MapReduce 的要求... - Eran Kampf
2个回答

5
将文件拆分为行,使用并行方式转换(映射)每一行,最后将结果行合并(归约)到一个文件中?

我编写了一个简单的map/reduce程序,它进行了一些小的转换,但以下是我面临的更深层次的挑战:文件通常被结构化为这样——第一行包含逗号分隔的列名列表。第二行及其余的行指定了相应的列值。在某些行中,尾随列的值可能会缺失,例如:如果有15列,则只对前10列指定值。 - sandeepkunkunuru
我有大约5个输入文件,需要将它们转换并聚合成一个文件。这些转换是特定于输入文件的。我如何传递上下文信息,例如文件名到映射器/减速器程序?转换是特定于列的,所以我如何记住第一行中提到的列,然后关联和转换行中的值? - sandeepkunkunuru

1

您不能依赖于第一行中的列信息。如果您的文件大于HDFS块,那么您的文件将被分成多个拆分,并且每个拆分都会分配给不同的Mapper处理。在这种情况下,只有接收第一个拆分的Mapper才会收到带有列信息的第一行,其他的则不会。

我建议将文件特定的元数据作为单独的文件传递,并将其作为附加数据进行分发。您的Mapper或Reducer任务可以读取元数据文件。

通过Hadoop Context对象,您可以获取由Mapper处理的文件的名称。在所有这些信息之间,我认为您已经获得了您所指的所有上下文信息,您可以进行特定于文件的转换。即使不同文件的转换逻辑不同,Mapper输出仍需要具有相同的格式。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接