BigQuery用户定义函数UDF样本,将使用protojs对 协议缓冲区进行编码和解码。
这个UDF允许你指定protobuf作为UDF本身的一部分_内联_。例如,你可以动态地指定要编码的proto,作为你传递给实际导出的函数的一个变量。
下面的proto描述了存在于公共BQ bigquery-public-data.san_francisco_film_locations.film_locations数据集中的一些字段。
syntax = "proto3";
复制代码
所以要把这些字段提取到proto中,要用类型指定JSON表示。
使用方法
你可以建立UDF或者使用这个 repo中的prto_udf.js。
要使用所提供的UDF,只需复制它并将其放入你的项目中的GCS桶中即可
构建
构建时,你将需要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"])。
你应该看到标题栏以及MovieScenes protobuf的BYTES表示法
现在导出该表,我们就可以对它进行查询了。在下面的例子中,我把数据导出到一个名为aead.pbencode的dataset.table中。
解码
要解码一个protobuf,运行以下查询。记住要改变GCS的URL,即UDF存储的地方library=["gs://mineral-minutia-820/proto_udf.js"],以及你保存protobuf的编码/字节形式的数据集
现在你应该看到解码后的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,人们通过强调和回应这个故事来继续对话。
作者:xcvxvxc
链接:https://juejin.cn/post/7088614148757536798