使用Java API / Dataflow将重复记录插入Big Query - “必须将重复字段导入为JSON数组”

时间:2016-06-28 22:27:30

标签: java google-bigquery google-cloud-dataflow

我将重复键值(String,String)记录对的数据作为Big Query表模式中的一个字段。

我正在尝试使用此方法添加这些重复记录:http://sookocheff.com/post/bigquery/creating-a-big-query-table-java-api/

为重复记录字段创建的表模式如下所示:

TableFieldSchema column = new TableFieldSchema().setName("rawFields");
column.setType("RECORD");
List<TableFieldSchema> list = new ArrayList<>();
list.add(new TableFieldSchema().setName("key").setType("STRING"));
list.add(new TableFieldSchema().setName("value").setType("STRING"));
column.setFields(list);
column.setMode("REPEATED");

我正在插入像这样的数据作为DoFn的一部分:

Map<String,String> record = ... // key-value pairs
List<TableRow> rawFields = new ArrayList<>();
record.forEach((k,v)->
    rawFields.add(new TableRow().set("key",k).set("value", v))
);
TableRow row = new TableRow();
// row has other fields, omitted here
row.set("rawFields", rawFields);

DoFn位于BigQueryIO.Write之前的数据流管道中:

.apply(BigQueryIO.Write
        .named("WriteLBLogLines")
        .to("xxx:yyy.zzz")
        .withSchema(mySchema)
        .withWriteDisposition(BigQueryIO.Write.WriteDisposition.WRITE_APPEND)
        .withCreateDisposition(BigQueryIO.Write.CreateDisposition.CREATE_IF_NEEDED));

当我尝试通过Dataflow运行时,我收到以下错误:

errorResult: JSON table encountered too many errors, giving up. Rows: 1; errors: 1., error: JSON table encountered too many errors, giving up. Rows: 1; errors: 1., error: JSON parsing error in row starting at position 0 at file: gs://xxxxxxxxxx/12271006010671464167/dax-tmp-2016-06-28_14_47_26-12271006010671462904-S04-1-303c4f638f6b411b/-shard-00002-of-00003-try-021aff4c448b3177-endshard.json. Repeated field must be imported as a JSON array. Field: rawFields.

我的做法有什么问题?我似乎没有使用正确的方法来插入重复记录。

1 个答案:

答案 0 :(得分:2)

我尝试使用以下代码重现该问题,但它已成功执行。架构的其他方面是否存在争议?

if tnsping oracle1 | grep --quiet OK
then
   echo "OK"
else
   echo "NOT OK"
fi