google-cloud-platform - 使用 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_level
BQ 中,但仍然使用 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;
}
}
可能有一种更清洁的方法,但到目前为止这是可行的。
推荐阅读
- rest - 使用多个不记名访问令牌的最佳实践
- javascript - 如何处理极高的数字Javascript
- php - 使用 PHP Yii2 为 froala 所见即所得编辑器添加音频插件时出错?
- mysql - 连接表中不存在记录时 SQL 不显示行
- ajax - VISJS 网络图 - Ajax
- pytorch - PyTorch 中的多维张量积
- python - 使用 for 循环将对象添加到 QGridLayout
- python - 问题按位置排序枚举列表
- python - 如何更改熊猫 DataFrame 的列值?
- java - 如何使用Java NIO将所有文件从源目录移动到目标目录,将现有文件保留在目标目录中?