我面临使用数据流将 API 摄取到 BQ 中的问题。在数据流中,我提取内容并将其传递到 BQ,而不进行任何解析。然而,它会像下面这样进入 BQ:
而这个词应该是实际的“Zählerablesung”。当我使用运行器作为“DataflowRunner”而不是“direct”执行数据流时,会发生这种特殊行为。我看到过类似的帖子并想到使用 UTF 编码。所以我稍微修改了代码。
@ProcessElement
public void processElement(OutputReceiver <String> receiver) throws IOException, ParseException {
if (this.conn.getResponseCode() == 200) {
BufferedReader in = new BufferedReader(new InputStreamReader(this.conn.getInputStream(), StandardCharsets.UTF_8));
String output;
output = new String(output.getBytes("UTF-8"));
StringBuilder response = new StringBuilder();
while ((output = in.readLine()) != null) {
response.append(output);
}
in.close();
JSONArray jsonArray = new JSONArray(response.toString());
jsonArray.iterator().forEachRemaining( jsonObject -> receiver.output(jsonObject.toString()));
}
}
不过,我没有看到任何差异。任何帮助将不胜感激
我在这里找到了解决方案。除了我在响应上添加了迭代之外,它与问题没有太大区别。另外,我删除了问题陈述中的额外编码步骤。
@ProcessElement
public void processElement(OutputReceiver <String> receiver) throws IOException {
if (this.conn.getResponseCode() == 200) {
BufferedReader in = new BufferedReader(new InputStreamReader(this.conn.getInputStream(), StandardCharsets.UTF_8));
String output;
StringBuilder response = new StringBuilder();
while ((output = in.readLine()) != null) {
response.append(output);
}
in.close();
JSONArray jsonArray = new JSONArray(response.toString());
Iterator<Object> iterator = jsonArray.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
receiver.output(obj.toString());
}
}
}
}
现在我可以在 BQ 中看到原始格式的数据了: