我使用avroparquetinputformat。用例需要扫描多个输入目录,每个目录都有一个模式的文件。因为avroparquetinputformat类不能处理多个输入模式,所以我创建了一个解决方法,通过静态创建多个伪类,比如myavroparquetinputformat1、myavroparquetinputformat2等,其中每个类只是从avroparquetinputformat继承。对于每个目录,我都设置了一个不同的myavroparquetinputformat,这很有效(请告诉我是否有更干净的方法来实现这一点)。
我目前的问题如下:
每个文件都有几百列,我基于元数据为每个目录构造了一个projectionschema,以减少不必要的磁盘和网络io。我在每个myavroparquetinputformat类上使用静态setrequestedprojection()方法。但是,由于是静态的,最后一个调用的projectionschema用于从所有目录中读取数据,这不是必需的行为。
如有任何关于解决方法/解决方案的建议,我们将不胜感激。
谢谢和问候
mk公司
1条答案
按热度按时间vshtjzan1#
请记住,如果您的avro模式是兼容的(有关模式兼容性的定义,请参阅avro文档),那么您可以使用单个模式访问所有数据。在此基础上,还可以构造一个与所有模式兼容的、对Parquet地板友好的模式(无并集),这样您就可以只使用该模式了。
至于你采取的方法,据我所知,没有一种简单的方法可以做到这一点。您必须以某种方式扩展multipleinputs功能,以便为每个输入格式分配不同的模式。多输入通过在作业配置中设置两个配置属性来工作:
这两个列表的长度必须相同。这就是问题的症结所在。这些信息在hadoop代码中被用来初始化Map器和输入格式,因此您应该在这里添加自己的代码。
作为一种替代方法,我建议您使用已有的工具之一进行投影,例如hive。如果没有太多不同的模式,您可以编写一组简单的配置单元查询来对每个模式进行投影,然后可以使用单个Map器来处理数据或任何您想要的东西。