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:你应该把它作为一个答案发布出来