Google bigquery 谷歌云发布/分云功能&;Bigquery-数据插入未发生
我使用的是谷歌云平台函数,它监听发布/分类主题,并在BigQuery中插入数据 我从发布/订阅控制台传递的输入数据是JSON格式{“NAME”,“ABCD”},但是从控制台日志中,我可以看到消息是以{NAME,ABCD}的形式出现的,在执行过程中,它也会出错。我面临的两个常见错误Google bigquery 谷歌云发布/分云功能&;Bigquery-数据插入未发生,google-bigquery,google-cloud-functions,google-cloud-pubsub,Google Bigquery,Google Cloud Functions,Google Cloud Pubsub,我使用的是谷歌云平台函数,它监听发布/分类主题,并在BigQuery中插入数据 我从发布/订阅控制台传递的输入数据是JSON格式{“NAME”,“ABCD”},但是从控制台日志中,我可以看到消息是以{NAME,ABCD}的形式出现的,在执行过程中,它也会出错。我面临的两个常见错误 SyntaxError:exports.helloPubSub中Object.parse(本机)位置1处JSON中意外的标记n“ 错误:{ERROR:rows[0].json'处的值无效 提供的输入: gclo
gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
尝试了使用单引号、方括号和其他可能的选项的各种输入数据格式,但没有任何帮助
解决方法类似于使用JSON.parse、JSON.stringfy,这有助于避免上述第一个问题,但最终导致行[0]
问题
当我将JSON输入数据作为硬编码值传递到云函数(如{“NAME”,“ABCD”}
)中时,数据被正确插入
/**This is working code since i hardcoded the data in JSON format, commented the lines which i tried and did not helped**/
/**
* Triggered from a message on a Cloud Pub/Sub topic.
*
* @param {!Object} event Event payload and metadata.
* @param {!Function} callback Callback function to signal completion.
*/
exports.helloPubSub = (event, callback) => {
const pubsubMessage = event.data;
console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();
//console.log(Buffer.from(pubsubMessage.data, 'base64').toString());
//console.log(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()));
var myjson='{"NAME":"ABCD","STATE":"HHHH","AGE":"12"}';
console.log(myjson);
bigquery
.dataset("DEMO")
.table("EMP")
.insert(JSON.parse(myjson),
{'ignoreUnknownValues':true, 'raw':false})
//.insert(JSON.parse(Buffer.from(pubsubMessage.data, 'base64').toString()),
.then ((data) => {
console.log('Inserted 1 rows');
console.log(data);
})
.catch(err => {
if (err && err.name === 'PartialFailureError') {
if (err.errors && err.errors.length > 0) {
console.log('Insert errors:');
err.errors.forEach(err => console.error(err));
}
} else {
console.error('ERROR`enter code here`:', err);
}
});
};
我使用gcloud进行了一个快速测试,以发布和提取消息 使用您提到的语法,我得到以下结果:
gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
gcloud pubsub subscriptions pull pubsubsubscription1
结果是:
资料│ {名称:ABCD}
如果改用此语法:
gcloud pubsub topics publish pubsubtopic1 --message "{\"name\":\"ABCD\"}"
gcloud pubsub subscriptions pull pubsubsubscription1
结果是:
数据{“名称”:“ABCD”}
编辑2019-04-01
上述解决方法用于测试目的,需要使用转义字符是使用命令行的一个警告。要从实际应用程序发布,可以使用REST调用或所列的客户端库。请注意,发布/订阅API要求消息采用base64编码。例如:
POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}
{
"messages": [
{
"data": "eyJuYW1lIjoiQUJDRCJ9"
}
]
}
我使用gcloud进行了一个快速测试,以发布和提取消息 使用您提到的语法,我得到以下结果:
gcloud pubsub topics publish pubsubtopic1 --message {"name":"ABCD"}
gcloud pubsub subscriptions pull pubsubsubscription1
结果是:
资料│ {名称:ABCD}
如果改用此语法:
gcloud pubsub topics publish pubsubtopic1 --message "{\"name\":\"ABCD\"}"
gcloud pubsub subscriptions pull pubsubsubscription1
结果是:
数据{“名称”:“ABCD”}
编辑2019-04-01
上述解决方法用于测试目的,需要使用转义字符是使用命令行的一个警告。要从实际应用程序发布,可以使用REST调用或所列的客户端库。请注意,发布/订阅API要求消息采用base64编码。例如:
POST https://pubsub.googleapis.com/v1/projects/{YOUR_PROJECT_ID}/topics/{YOUR_TOPIC}:publish?key={YOUR_API_KEY}
{
"messages": [
{
"data": "eyJuYW1lIjoiQUJDRCJ9"
}
]
}
非常感谢mike,您上面提到的方法非常有效,但我的源数据将始终使用正确的JSON格式,而没有附加此“\”符号。请您帮助理解为什么我们的JSON语法不起作用!根据您的建议,我认为唯一可行的方法是,我们需要找到一种方法来包括”\“每次处理源JSON数据集时都会出现。请建议您是否找到更好的解决方案嗨,我用最新的评论更新了解决方案。谢谢Mike。您的第一个解决方案对我帮助很大。我在云函数中做了更改,将{JSON}转换为{“JSON”}”使用java脚本替换方法格式化。消息正在被正确地拾取和插入。现在使用不同的数据集进行测试。如果还有任何问题,我将在这里更新。再次感谢Hanks,mike,您提到的方法非常有效,但我的源数据将始终使用正确的JSON格式,而JSON格式没有这是附加的“\”。请您帮助理解为什么我们的JSON语法不起作用!根据您的建议,我认为唯一可行的方法是,我们需要找到一种包含“\”的方法每次处理源JSON数据集时都会出现。请建议您是否找到更好的解决方案。嗨,我用最新的评论更新了解决方案。谢谢Mike。您的第一个解决方案对我帮助很大。我在云函数中做了更改,将{JSON}转换为{“JSON”}使用java脚本替换方法格式化。正在正确地拾取和插入消息。正在使用不同的数据集进行测试。如果还有任何问题,我将在此处更新。再次感谢