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
使用 Load Table API 时,BigQuery 不接受在线生成的架构定义架构生成器