如何使用Avro处理无法跳转的流?

3 投票
1 回答
1540 浏览
提问于 2025-04-16 04:32

我正在使用Avro 1.4.0通过Python的avro绑定和boto S3库从S3读取一些数据。当我在boto返回的文件对象上打开avro.datafile.DataFileReader时,它在尝试查找数据时立刻失败。现在我暂时通过将S3对象读取到临时文件中来解决这个问题。

我希望能够流式读取任何支持read()的Python对象。有没有人能给点建议?

1 个回答

2

我对这个问题不是很清楚,可能我的理解不太对。

我原本以为

diter = datafile.DataFileReader(..) 

会返回一个迭代器,这样你就可以做以下操作

for data in diter:
    ....

如果我错了,请纠正我。

再回到我的回答:

你说得对,datafile.DataFileReader和那些无法使用seek功能的读取器不太兼容。

它使用的是avro.io.BinaryDecoder,这个解码器需要一个读取器。

class BinaryDecoder(object):
    """Read leaf values."""
    def __init__(self, reader):
        """
    reader is a Python object on which we can call read, seek, and tell.
    """
    self._reader = reader

你可以创建一个自己的读取器类,提供这些功能——读取、定位和获取当前位置,但内部使用boto S3库来读取数据。

撰写回答