BigQuery UDF对协议缓冲区进行管理和非管理

2022-06-01 00:00:00 字段 代码 编码 复制 解码

BigQuery用户定义函数UDF样本,将使用protojs对 协议缓冲区进行编码和解码。

这个UDF允许你指定protobuf作为UDF本身的一部分_内联_。例如,你可以动态地指定要编码的proto,作为你传递给实际导出的函数的一个变量。

下面的proto描述了存在于公共BQ bigquery-public-data.san_francisco_film_locations.film_locations数据集中的一些字段。

syntax = "proto3";
复制代码

所以要把这些字段提取到proto中,要用类型指定JSON表示。

medium.com/media/9ff47…

使用方法

你可以建立UDF或者使用这个 repo中的prto_udf.js。

要使用所提供的UDF,只需复制它并将其放入你的项目中的GCS桶中即可

salrashid123/bq-udf-protobuf

构建

构建时,你将需要nodejs和webpack,它是包装proto-js的转换工具。

  • 设置Webpack
mkdir webpack-demo
复制代码
  • 创建WebPack配置和UDF函数

用附录中的内容创建以下文件 webpack-demo/webpack.config.js 和 webpack-demo/src/index.js

  • 生成webpack
npx webpack --config webpack.config.js
复制代码

这将在webpack-demo/dist/main.js处生成webpack

编辑proto_udf.js,然后把main.js的内容复制到这个文件中,如下图所示

---> content of webpack-demo/dist/main.js <---
复制代码
function protoSave(d,t,k) {
复制代码

将该文件上传到你项目中的GCS桶中

gsutil cp proto_udf.js gs://PROJECT_ID/
复制代码

使用

编码

在BigQuery控制台中,运行以下查询,该查询将引用你的UDF并对一些字段进行编码。(记住)修改GCS的URL(library=["gs://$PROJECT_ID/proto_udf.js"])。

medium.com/media/b68cf…

你应该看到标题栏以及MovieScenes protobuf的BYTES表示法

现在导出该表,我们就可以对它进行查询了。在下面的例子中,我把数据导出到一个名为aead.pbencode的dataset.table中。

解码

要解码一个protobuf,运行以下查询。记住要改变GCS的URL,即UDF存储的地方library=["gs://mineral-minutia-820/proto_udf.js"],以及你保存protobuf的编码/字节形式的数据集

medium.com/media/74a29…

现在你应该看到解码后的protobuf列了

附录

  • webpack.config.js
const path = require('path');
复制代码
module.exports = {
复制代码
  • webpack-demo/src/index.ts
var protobuf = require("protobufjs");
复制代码
const {encode, decode} = require('base64-arraybuffer');
复制代码
module.exports.ProtoSave = function (d,t,payload) {
复制代码
module.exports.DecodeBuf = function (d) {
复制代码

就这样!......你已经完全用bigquery动态地编码和解码了一个protobuf(大部分)!


BigQuery UDF对协议缓冲区进行编码和解密初发表于Google Cloud - Community onMedium,人们通过强调和回应这个故事来继续对话。

相关文章