【发布时间】:2021-06-04 06:46:03
【问题描述】:
我有一个包含Strings 的数据流,看起来像JSONArrays。我想解析这些字符串并使用 Apache Beam 写入 BigQuery 表,但在写入重复字符串时出现错误。
以下是我将字符串转换为 TableRow 的方法:
String dataString = "[{\"EMAIL\": [\"zog@yahoo.com\"]}]";
JSONArray jsonArray = new JSONArray(dataString);
TableRow tableRow = new TableRow();
for (int i = 0; i < jsonArray.length(); i++) {
JSONArray emailArray = new JSONArray(jsonArray.getJSONObject(i).get("EMAIL").toString());
tableRow.set("EMAIL", emailArray); //Results in error
}
这是我的 BigQuery 架构的样子:
[
{
"name": "EMAIL",
"type": "STRING",
"mode": "REPEATED"
}
]
我已经设法使用 Python 将类似的重复字符串写入 BigQuery 表,但无法使用 Apache Beam。我想我没有在TableRow 中保存正确的键值对。我现在得到的错误是:
java.io.IOException: Insert failed: [{"errors":[{"debugInfo":"","location":"email","message":"This field is not a record.","reason":"invalid"}],"index":0}]
我需要有关如何在不创建记录的情况下将类似的重复字符串保存到 BigQuery 的帮助,如果有任何建议或建议,我将不胜感激。提前致谢。
【问题讨论】:
-
该错误消息似乎可能是因为尝试将 EMAIL 设置为不正确的值。您的dataString示例是否准确?因为如果我正确解释它,它是一个包含两个
JSONObjects的数组,第一个只定义了EMAIL字段,第二个只定义了ValidFrom字段。如果在写入 BQ 时EMAIL字段设置为 NULL,我可能会看到问题。 -
数据字符串是准确的,是的,Daniel。但是请原谅我没有在任何地方检查元素类型的错误。由于我是在我的原始代码中检查数据类型,所以我删除了上面sn-p中不必要的代码。
标签: java google-bigquery google-cloud-dataflow apache-beam