hadoop - 为 AvroParquetInputFormat 设置多个 projectionSchemas 的问题

标签 hadoop mapreduce avro parquet

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

我目前的问题如下:

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

非常感谢任何指向解决方法/解决方案的指示。

感谢和问候

马可

最佳答案

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

至于您采用的方法,据我所知,没有简单的方法可以做到这一点。您必须以某种方式扩展 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)进行投影。如果没有太多不同的模式,您可以编写一组简单的配置单元查询来为每个模式进行投影,然后您可以使用单个映射器来处理数据或任何您想要的东西。

关于hadoop - 为 AvroParquetInputFormat 设置多个 projectionSchemas 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27846803/

相关文章:

hadoop - 具有非空列的平均函数 - Hive

hadoop - 自定义 SerDe 的 Hive 异常

python - 如何在Python中处理JSON文件中的字节字段?

google-cloud-platform - 将 Avrocoder 用于具有泛型的自定义类型

hive - 架构演变比较 Apache Avro 与 Apache Parquet

Hadoop 和 Cassandra 基准测试

mysql - Hive 中的高效子查询

java - 在 FileSystem.liststatus 中过滤日志文件(_success 和 _log)

hadoop - Snappy文件压缩将计数器值添加到数据中

具有已排序文件的 Hadoop MapReduce