我正在尝试读取存储在供应商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。
要解决这个问题,可以执行以下操作之一:
- 等待新版本发布
- 修补调用,使它不做那个检查
- 代替使用
BytesIO
,你可以做你自己的包装器对象,模仿BytesIO
,但有一个mode
属性。