Python 从发布/订阅中读取并处理gzip
我正在构建一个管道,通过GoogleCloudDataflow(Python SDK)处理一些压缩的JSON消息。更准确地说,在发布到Google Cloud Pub/Sub之前,JSON文件被分组(4组)并以gzip格式压缩。然而,一旦发布,我不知道如何解压缩它们,然后为每个JSON消息创建一个PCollection(即4个PCollection)。Python 从发布/订阅中读取并处理gzip,python,gzip,google-cloud-dataflow,apache-beam,google-cloud-pubsub,Python,Gzip,Google Cloud Dataflow,Apache Beam,Google Cloud Pubsub,我正在构建一个管道,通过GoogleCloudDataflow(Python SDK)处理一些压缩的JSON消息。更准确地说,在发布到Google Cloud Pub/Sub之前,JSON文件被分组(4组)并以gzip格式压缩。然而,一旦发布,我不知道如何解压缩它们,然后为每个JSON消息创建一个PCollection(即4个PCollection)。 如果我在ReadFromPubSub步骤之后记录PCollection,我会得到如下结果: INFO:root:b'\x1f\xe2\x80\x
如果我在ReadFromPubSub步骤之后记录PCollection,我会得到如下结果:
INFO:root:b'\x1f\xe2\x80\xb9\x08\...\x06\x00\x00'
我想这是消息的主体(字节对象)。管道如下:
with beam.Pipeline(options=pipeline_options) as pipeline:
events = (
pipeline
| 'Read PubSub Messages' >> beam.io.ReadFromPubSub(subscription=params["input_subscription"])
| 'Logging zipped' >> beam.ParDo(beam_utils.LogFn())
| 'Uncompress data' >> beam.ParDo(UncompressData())
)
其中:
class UncompressData(beam.DoFn):
def process(self, element):
decompressed_byte_data = zlib.decompress(element, zlib.MAX_WBITS|32)
yield decompressed_byte_data
但它不起作用,导致zlib.error(与zlib.MAX|WBITS | 16相同):
以前有人遇到过类似的问题吗?欢迎任何建议或解决方案 嘿,费德里科,帮你了吗?我尝试了那篇文章中列出的所有解决方案,但没有一个能正常工作。使用解压缩返回“error-3”,使用read()返回“embedded null byte”或“Not a gzip file(b'\x1f\xe2')”。问题可能出在压缩端。您是否使用压缩对象压缩数据,如
zlib.compressobj(9,zlib.DEFLATED,zlib.MAX|WBITS | 16)
?否,gzip压缩是使用外部工具执行的。它到底是什么外部工具?现在我尝试解压缩非常相似的数据\x1f\xe2\x80\xb9\x08\x00\x00\x00\x00\…x03\x00\x00'
。你的问题解决了吗?
zlib.error: Error -3 while decompressing data: incorrect header check [while running 'Uncompress data']