从 S3 读取内存中的 Avro 文件:"属性错误:"



我正在尝试读取存储在供应商S3中的Avro文件并写入DW。参见下面的代码。(大致是从这个S/O线程工作的)

obj = obj.get()
raw_bytes = obj["Body"].read()
avro_bytes = io.BytesIO(raw_bytes)
reader = DataFileReader(avro_bytes, DatumReader())

代码在最后一行出错,在那里我得到了错误:AttributeError: '_io.StringIO' object has no attribute 'mode'

这个错误来自源代码中初始化DataFileReader的位置。

def __init__(self, reader: IO[AnyStr], datum_reader: avro.io.DatumReader) -> None:
if "b" not in reader.mode:
warnings.warn(avro.errors.AvroWarning(f"Reader binary data from a reader {reader!r} that's opened for text"))
bytes_reader = getattr(reader, "buffer", reader)

我试过用avro_bytes作为StringIO,看看是否有帮助,但它没有。

你知道如何通过AttributeError吗?

这是一个错误的版本1.11.0已经固定但尚未发布新版本:https://issues.apache.org/jira/browse/avro - 3252。

要解决这个问题,可以执行以下操作之一:

  1. 等待新版本发布
  2. 修补调用,使它不做那个检查
  3. 代替使用BytesIO,你可以做你自己的包装器对象,模仿BytesIO,但有一个mode属性。

最新更新