0

我使用 AvroParquetInputFormat。用例需要扫描多个输入目录,并且每个目录将包含具有一个模式的文件。由于 AvroParquetInputFormat 类无法处理多个输入模式,因此我通过静态创建多个虚拟类(如 MyAvroParquetInputFormat1、MyAvroParquetInputFormat2 等)创建了一个解决方法,其中每个类仅继承自 AvroParquetInputFormat。对于每个目录,我设置了不同的 MyAvroParquetInputFormat 并且有效(请告诉我是否有更简洁的方法来实现这一点)。

我目前的问题如下:

每个文件有几百列,基于元数据,我为每个目录构建了一个 projectionSchema,以减少不必要的磁盘和网络 IO。我在每个 MyAvroParquetInputFormat 类上使用静态 setRequestedProjection() 方法。但是,由于是静态的,最后一次调用的 projectionSchema 用于从所有目录读取数据,这不是必需的行为。

任何指向变通办法/解决方案的指针都将受到高度赞赏。

感谢和问候

MK

4

1 回答 1

2

请记住,如果您的 avro 架构兼容(请参阅 avro 文档了解架构兼容性的定义),您可以使用单个架构访问所有数据。对此进行扩展,还可以构建一个与所有模式兼容的镶木地板友好模式(无联合),因此您可以只使用那个模式。

至于您采取的方法,据我所知,没有简单的方法可以做到这一点。您必须以某种方式扩展 MultipleInputs 功能,以便为每种输入格式分配不同的模式。MultipleInputs 通过在作业配置中设置两个配置属性来工作:

mapreduce.input.multipleinputs.dir.formats //contains a comma separated list of InputFormat classes
mapreduce.input.multipleinputs.dir.mappers //contains a comma separated list of Mapper classes.

这两个列表的长度必须相同。这就是棘手的地方。此信息在 hadoop 代码中用于初始化映射器和输入格式,因此您应该在其中添加自己的代码。

作为替代方案,我建议您使用已经可用的工具之一进行投影,例如 hive。如果没有太多不同的模式,您可以编写一组简单的配置单元查询来为每个模式进行投影,然后您可以使用单个映射器来处理数据或任何您想要的东西。

于 2015-01-09T11:45:29.590 回答