使用 Avro 将对象编码为 Python 中的字节数组

Posted

技术标签:

【中文标题】使用 Avro 将对象编码为 Python 中的字节数组【英文标题】:Encode an object with Avro to a byte array in Python 【发布时间】:2014-06-30 03:26:47 【问题描述】:

在 python 2.7 中,我想使用 Avro 将对象编码为字节数组。

我找到的所有示例都写入文件。

我尝试过使用 io.BytesIO() 但这给出了:

AttributeError: '_io.BytesIO' object has no attribute 'write_long'

使用 io.BytesIO 的示例

def avro_encode(raw, schema):
    writer = DatumWriter(schema)
    avro_buffer = io.BytesIO()
    writer.write(raw, avro_buffer)
    return avro_buffer.getvalue()

【问题讨论】:

【参考方案1】:

您的问题帮助我解决了问题,谢谢。这是一个基于文档中python示例的简单python示例:

import io
import avro.schema
import avro.io

test_schema = '''

"namespace": "example.avro",
 "type": "record",
 "name": "User",
 "fields": [
     "name": "name", "type": "string",
     "name": "favorite_number",  "type": ["int", "null"],
     "name": "favorite_color", "type": ["string", "null"]
 ]

'''

schema = avro.schema.parse(test_schema)
writer = avro.io.DatumWriter(schema)

bytes_writer = io.BytesIO()
encoder = avro.io.BinaryEncoder(bytes_writer)
writer.write("name": "Alyssa", "favorite_number": 256, encoder)
writer.write("name": "Ben", "favorite_number": 7, "favorite_color": "red", encoder)

raw_bytes = bytes_writer.getvalue()
print(len(raw_bytes))
print(type(raw_bytes))

bytes_reader = io.BytesIO(raw_bytes)
decoder = avro.io.BinaryDecoder(bytes_reader)
reader = avro.io.DatumReader(schema)
user1 = reader.read(decoder)
user2 = reader.read(decoder)

print(user1)
print(user2)

【讨论】:

如果您想在 Python 3 下运行它,请将“schema = avro.schema.parse(test_schema)”更改为“schema = avro.schema.Parse(test_schema)” 快速问题,当我尝试将这些字节流写入文件然后将其保存在 hdfs 上时,hdfs dfs -text 命令无法将其转换回字符串,显然我错过了任何将流写入文件之前的步骤。 有没有办法将bytes_writer 作为avro 文件写入s3 存储桶? client.upload_fileobj(Bucket=aws.s3_bucket_name, Key=f's3_key/file_name', Fileobj=bytes_writer) 这样创建文件但内容为空。 并关注authentise.com/post/getting-started-with-avro-and-python-3【参考方案2】:

使用 import avro 库,我们无法使用架构编写 avro 文件。

要解决这个问题,请使用fastavro 例如

import io
import fastavro
data = ["name": "Shravan", "favorite_number": 256, "name": "Ram", "favorite_number": 7, "favorite_color": "red"]
bytes_writer = io.BytesIO()
fastavro.writer(bytes_writer, get_avro_schema(), data)
print(bytes_writer.get_value())

【讨论】:

为什么我们不能用架构编写 avro 文件? 我尝试使用import avro,但是我无法创建 avro 文件。所以我使用了fastavro 但是看看这个问题的另一个答案 (***.com/a/25130722/7127824)。使用了一个模式。特别是以下几行:schema = avro.schema.parse(test_schema)writer = avro.io.DatumWriter(schema) 我的意思是你的答案可能会以fastavro 的形式出现,但带有架构的部分看起来不像是真的

以上是关于使用 Avro 将对象编码为 Python 中的字节数组的主要内容,如果未能解决你的问题,请参考以下文章

AVRO 的二进制编码是不是压缩数据?

python3 中encode 和decode的使用方法。

python3 中encode 和decode的使用方法。

数据流 - 将 avro 对象存储到未知的 GCS 文件夹

micropython中怎么将gb2312编码的字节流变成中文

从 POJO 到 Avro Record 的通用转换