BigQuery 不接受来自 protobuf 的二进制数据

Posted

技术标签:

【中文标题】BigQuery 不接受来自 protobuf 的二进制数据【英文标题】:BigQuery does not accept binary data from protobuf 【发布时间】:2021-01-14 21:50:31 【问题描述】:

我有一个数据流管道将数据从 pub sub 解析到大查询。 数据为proto3格式。

我从 pubsub 收到的数据是使用 protobuf 中的“SerializeToString()”方法编码的。 然后我反序列化它并将解析的数据插入到 bigquery 中,它工作得很好。但是,我被要求存储来自 probotobuf 的二进制数据,以防在插入时出现问题。 为此,我创建了一个简单的 bigquery 表,其中只有一个“数据”字段,接受 BYTES。

所以我在管道中添加了一个步骤,它只是从 PubSub 消息中获取数据并返回:

class GetBytes(beam.DoFn):
    def process(self, element):

        obj: Dict = 
            'data': element.data
        
        logging.info(f'data bytes: obj')
        logging.info(f'data type: type(obj["data"])')
        return [obj]

这是我用来插入 BQ 的管道中的行:

    bytes_status = (status | 'Get Bytes Result' >> beam.ParDo(GetBytes()))
    bytes_status | 'Write to BQ BackUp' >> beam.io.WriteToBigQuery('my_project:my_dataset.my_table')

logs 似乎得到了正确的数据:

2020-09-29 11:16:40.094 CESTdata 字节:'data': b'\n\x04\x08\x01\x10\x02\n\x04\x08\x02\x10\x02\n\ x02\x08\x03\n\x04\x08\x04\x10\x02\n\x04\x08\x05\x10\x02\n\x04\x08\x06\x10\x02\n\x02\x08\x07\ n\x04\x08\x08\x10\x01\n\x02\x08\t\n\x04\x08\n\x10\x01\n\x04\x08\x0b\x10\x02\n\x02\x08\ x0c\n\x04\x08\r\x10\x02\n\x04\x08\x0e\x10\x02\n\x04\x08\x0f\x10\x02\n\x04\x08\x10\x10\x02\ n\x04\x08\x11\x10\x01\n\x04\x08\x12\x10\x01\n\x04\x08\x01\x10\x02\n\x02\x08\x02\n\x04\x08\ x03\x10\x01\n\x02\x08\x04\n\x04\x08\x05\x10\x02\n\x04\x08\x06\x10\x01\n\x04\x08\x07\x10\x02\ n\x02\x08\x08\n\x04\x08\t\x10\x01\n\x04\x08\n\x10\x02\n\x04\x08\x0b\x10\x01\n\x02\x08\ x0c\n\x04\x08\r\x10\x02\n\x04\x08\x0e\x10\x02\n\x04\x08\x0f\x10\x02\n\x04\x08\x10\x10\x02\ n\x04\x08\x11\x10\x02\n\x04\x08\x12\x10\x02\x10\xb4\x95\x99\xc9\xcd.'

但我一直收到以下错误:

UnicodeDecodeError: 'utf-8 [while running 'generatedPtransform-297']' codec can't decode byte 0x89 in position 101: invalid start byte

(可能错误与之前的日志不对应,但一直都是这种消息)

我尝试从 BigQuery 用户界面插入我的字节数据,一切正常...

知道出了什么问题吗?

谢谢你:)

【问题讨论】:

您使用的是什么版本的 Beam? 嘿@Pablo 我使用 apache-beam[gcp]==2.24.0 【参考方案1】:

BigQuery 要求 bytes 值在以这种方式编写时进行 base64 编码。您可以在https://beam.apache.org/releases/pydoc/2.24.0/apache_beam.io.gcp.bigquery.html#additional-parameters-for-bigquery-tables找到一些文档和链接以获取更多详细信息

【讨论】:

哦,好的,用于 python 的 apache beam sdk 正在使用旧 sql 而不是标准 sql...真可惜!

以上是关于BigQuery 不接受来自 protobuf 的二进制数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中将 protobuf 转换为 bigquery

在 BigQuery 中创建动态视图

使用 Load Table API 时,BigQuery 不接受在线生成的架构定义架构生成器

使用来自 Google BigQuery 的数据更新电子表格不起作用

服务帐号和项目之间的 BigQuery 关系

Big Query 不接受 EMOJI