gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 16:31:54 27 4
gpt4 key购买 nike

我使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com