首页 > 解决方案 > 使用 GCP Dataflow PubSub 到 BigQuery 模板时出现表列名称问题

问题描述

背景:

我有消息发布到 Pub/Sub 主题,我正在尝试使用 Dataflow 和"Cloud Pub/Sub Topic to BigQuery"模板将它们流式传输到 BigQuery。(阅读有关流媒体模板的更多信息。)

问题:

Pub/Sub 消息中的某些字段名称包含破折号 ( -),我无法控制它,并且 Dataflow 模板似乎期望目标 BigQuery 表中的字段名称完全相同。BQ 的一个限制是-字段名称中不允许使用破折号 ( ),但允许使用下划线。params.gsm_level因此,尽管我在 BQ 中有一个专栏,但我遇到了这样的错误:

{
  "errors" : [ {
    "debugInfo" : "",
    "location" : "params.gsm-level",
    "message" : "no such field.",
    "reason" : "invalid"
  } ],
  "index" : 0
}

问题:

我可以做些什么来gsm-level将消息映射到gsm_levelBQ 中,但仍然使用 DF 模板而不编写自己的工作?谢谢!

标签: google-cloud-platformgoogle-bigquerygoogle-cloud-messaginggoogle-cloud-dataflow

解决方案


我能够使用带有辅助函数的 Javascript UDF 来“清理”键名:

function _transform(value){
    var objectConstructor = {}.constructor;
    var arrayConstructor = [].constructor;

    if (value.constructor === objectConstructor) {
        var out = {};
        for (var key in value) {
            if (value.hasOwnProperty(key)) {
                //console.log(key + " -> " + value[key]);
                var cleaned_key = key.replace(/-/g, '_');
                out[cleaned_key] = _transform(value[key]);
            }
        }
        return out;
    } else if (value.constructor === arrayConstructor) {
        var cleaned_arr = [];
        value.forEach(function(item, index) {
            cleaned_arr.push(_transform(item));
        });
        return cleaned_arr;
    } else {
        return value;
    }
}

可能有一种更清洁的方法,但到目前为止这是可行的。


推荐阅读