Google cloud platform 使用GCP Dataflow PubSub到BigQuery模板时出现表列名问题 背景:

Google cloud platform 使用GCP Dataflow PubSub到BigQuery模板时出现表列名问题 背景:,google-cloud-platform,google-bigquery,google-cloud-messaging,google-cloud-dataflow,Google Cloud Platform,Google Bigquery,Google Cloud Messaging,Google Cloud Dataflow,我将消息发布到一个发布/订阅主题,我正试图使用“Cloud Pub/Sub topic to BigQuery”模板,使用数据流将它们流式传输到BigQuery中。(请阅读更多信息。) 问题: Pub/Sub消息中的一些字段名包含dash(-),我无法控制这些字段,数据流模板似乎希望目标BigQuery表中的字段名完全相同。BQ的一个限制是字段名中不允许使用破折号(-),尽管允许使用下划线。因此,尽管我在BQ中有一个params.gsm\u level列,但我还是会遇到这样的错误: { "e

我将消息发布到一个发布/订阅主题,我正试图使用
“Cloud Pub/Sub topic to BigQuery”
模板,使用数据流将它们流式传输到BigQuery中。(请阅读更多信息。)

问题: Pub/Sub消息中的一些字段名包含dash(
-
),我无法控制这些字段,数据流模板似乎希望目标BigQuery表中的字段名完全相同。BQ的一个限制是字段名中不允许使用破折号(
-
),尽管允许使用下划线。因此,尽管我在BQ中有一个
params.gsm\u level
列,但我还是会遇到这样的错误:

{
  "errors" : [ {
    "debugInfo" : "",
    "location" : "params.gsm-level",
    "message" : "no such field.",
    "reason" : "invalid"
  } ],
  "index" : 0
}
问题:
我可以做些什么来将消息中的
gsm级别
映射到BQ中的
gsm\u级别
,但仍然使用DF模板而不编写我自己的作业?谢谢

我能够使用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;
    }
}

也许有一个更干净的方法,但到目前为止,这是可行的。

fyi:你应该把它作为一个答案发布出来