繁体   English   中英

BigQuery Streaming Insert Error - 在数组外添加重复记录

[英]BigQuery Streaming Insert Error - Repeated record added outside of an array

我在使用 Dataflow Streaming Insert 时遇到了一个奇怪的问题。 我有一个包含大量记录和数组的 JSON。 我使用流式插入方法和类 DeadLetters 设置了管道来处理错误。

formattedWaiting.apply("Insert Bigquery ",
                BigQueryIO.<KV<TableRow,String>>write()
                .to(customOptions.getOutputTable())
                .withFormatFunction(kv -> kv.getKey())
                .withMethod(BigQueryIO.Write.Method.STREAMING_INSERTS)
                .withSchemaFromView(schema)
                .withCreateDisposition(CreateDisposition.CREATE_IF_NEEDED)
                .withWriteDisposition(WriteDisposition.WRITE_APPEND)
                .withFailedInsertRetryPolicy(InsertRetryPolicy.retryTransientErrors())
                .withoutValidation()
                .withExtendedErrorInfo()
                .withTimePartitioning(new TimePartitioning().setField(customOptions.getPartitionField().get()))
                .withClustering(clusteringFieldsList)
                .withExtendedErrorInfo())
                .getFailedInsertsWithErr()
                .apply("Taking 1 element insertion", Sample.<BigQueryInsertError>any(1))
                .apply("Insertion errors",ParDo.of(new DeadLettersHandler()));

问题是当我使用流式插入方法时,有些行没有插入到表中,我收到了错误:

在数组外添加名称为 XXXX 的重复记录。

我仔细检查了有问题的 JSON,一切似乎都很好。 奇怪的部分是当我评论withMethod行时,行插入完全没有问题。

我不知道为什么管道有这种行为。

JSON 看起来像这样。

{
   "parameters":{
      "parameter":[
         {
            "subParameter":[
               {
                  "value":"T",
                  "key":"C"
               },
               {
                  "value":"1",
                  "key":"SEQUENCE_NUMBER"
               },
               {
                  "value":"1",
                  "key":"SEQUENCE_NUMBER"
               }
            ],
            "value":"C",
            "key":"C"
         },
         {
            "subParameter":[
               {
                  "value":"T",
                  "key":"C"
               },
               {
                  "value":"1",
                  "key":"SEQUENCE_NUMBER"
               },
               {
                  "value":"2",
                  "key":"SEQUENCE_NUMBER"
               }
            ],
            "value":"C",
            "key":"C"
         }
      ]
   }
}

BigQuery 架构很好,因为我可以在评论 BigQueryIO 中的流式插入行时插入数据

有想法的小伙伴吗?

提前致谢!

只是对这个问题的更新。

问题在于模式声明和 JSON 本身。

我们将parameters列定义为RECORD REPEATEDparameters是 JSON 示例中的对象。

所以我们在这里有两个选择。

  1. 将 BigQuery 架构从RECORD REPEATED更改为RECORD NULLABLE
  2. 将括号 [] 添加到parameters对象,对于此选项,您必须转换 JSON 并添加括号以将对象视为数组。

例子:

{
   "parameters":[
      {
         "parameter":[
            {
               "subParameter":[
                  {
                     "value":"T",
                     "key":"C"
                  },
                  {
                     "value":"1",
                     "key":"SEQUENCE_NUMBER"
                  },
                  {
                     "value":"1",
                     "key":"SEQUENCE_NUMBER"
                  }
               ],
               "value":"C",
               "key":"C"
            }
         ]
      }
   ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM