Проблема Вставка JSON с массивом в BigQuery с помощью Nifi - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь вставить приведенные ниже данные json в таблицу больших запросов с помощью процессора Nifi. PutBigQueryBatch 1.9.2

{    
"Revenue_Label": "Dining Room",     
"StoreName": "STORE A",     
"Revenue_Id": "1",     
"Alteration_Flag": "False",     
"Order_Mode_Label": "DriveThru",     
"checkClosetime": "2019-10-24T13:43:19+13:00",     
"Alterations": [        {            
"Alteration_Product_Code": "211136",             
"Alteration_Product_Net_Amount": 0.0,             
"Altered_Product_Code": "211135",             
"Alteration_Product_Amount": 0.0,             
"Altered_Product_Name": "Burger",             
"Alteration_Product_Name": "Add Sauce",             
"Alteration_Product_Qty": 1.0        }    ],     
"StoreId": "1234",    
 "dob": "20191024",     
 "Order_Mode_Id": "3",     
 "checknumber": "54321"}

Однако я продолжаю получать приведенную ниже ошибку

PutBigQueryBatch: поле RECORD должно содержать хотя бы одно подполе: java.lang.IllegalArgumentException: поле RECORD должно содержать хотя бы одно подполе

в свойствах PutBigQueryBatch, которые я использовалприведенное ниже определение схемы, которое соответствует определению таблицы BigQuery по порядку, режиму, имени и типу

[
  {"mode": "NULLABLE","name": "Revenue_Label","type": "STRING"},
  {"mode": "NULLABLE","name": "StoreName","type": "STRING"},
  {"mode": "NULLABLE","name": "Revenue_Id", "type": "STRING" },
  {"mode": "NULLABLE","name": "Alteration_Flag","type": "STRING"},
  {"mode": "NULLABLE","name": "Order_Mode_Label","type": "STRING"},
  {"mode": "NULLABLE","name": "checkClosetime","type": "TIMESTAMP" },
  {"mode": "REPEATED",    
   "name": "Alterations",    
   "type": "RECORD",    
     "fields": [      
                {"mode": "NULLABLE","name": "Alteration_Product_Code", "type": "STRING" },
                {"mode": "NULLABLE", "name": "Alteration_Product_Net_Amount", "type": "FLOAT" },
                {"mode": "NULLABLE", "name": "Altered_Product_Code","type": "STRING" },
                {"mode": "NULLABLE", "name": "Alteration_Product_Amount",  "type": "FLOAT" },
                {"mode": "NULLABLE", "name": "Altered_Product_Name", "type": "STRING" },
                {"mode": "NULLABLE", "name": "Alteration_Product_Name",  "type": "STRING" },
                {"mode": "NULLABLE","name": "Alteration_Product_Qty",   "type": "FLOAT"      } 
                ]  
    },    
  {"mode": "NULLABLE","name": "StoreId","type": "STRING"},
  {"mode": "NULLABLE", "name": "dob","type": "STRING"},
  {"mode": "NULLABLE","name": "Order_Mode_Id","type": "STRING"},
  {"mode": "NULLABLE","name": "checknumber","type": "STRING" }
 ]

Что я пробовал:

  1. Удалены всепробелы и символы возврата каретки из потока json
  2. Попробовал массив в начале и конце файла json и сопоставил таблицу BigQuery с этим.
  3. Изменил Имена элементов на notвключить подчеркивания.
  4. Построил вставку по одному столбцу за раз и завершился неудачей только при наличии массива.
  5. Использовал сгенерированное определение схемыиз Google Cloud BigQuery напрямую при использовании утилиты "bq show --schema --format = prettyjson.
  6. Определен режим для каждого из элементов массива ТРЕБУЕТСЯ вместо NULLABLE.
  7. Удалено всепробелы и символы возврата каретки из определения схемы в свойствах процесса PutBigQueryBatch в Nifi

Все вылилось в ту же ошибку, как указано выше

Примечание В другом месте моего процесса nifi я успешно использую процесс PutBigQueryBatch и обновляю таблицу. Разница в том, что у json нет массива.

У кого-нибудь есть идеи, как решить проблему?

Ответы [ 2 ]

0 голосов
/ 13 ноября 2019

На основании вашего поста я вижу, что вы определяете поле ПОВТОРНОЕ как Изменения в определении вашей схемы;однако в JSON, который вы используете для загрузки своих данных, это поле отображается как Изменения

0 голосов
/ 03 ноября 2019

Из документации ваше первоначальное определение выглядит правильно. Каким-то образом пробелы или табуляции могут сделать ошибку, поэтому попробуйте ее с более отформатированной.

Довольно:

{ 
    "Revenue_Label":"Dining Room",
    "StoreName":"STORE A",
    "Revenue_Id":"1",
    "Alteration_Flag":"False",
    "Order_Mode_Label":"DriveThru",
    "checkClosetime":"2019-10-24T13:43:19+13:00",
    "Alterations":[ 
        { 
            "Alteration_Product_Code":"211136",
            "Alteration_Product_Net_Amount":0.0,
            "Altered_Product_Code":"211135",
            "Alteration_Product_Amount":0.0,
            "Altered_Product_Name":"Burger",
            "Alteration_Product_Name":"Add Sauce",
            "Alteration_Product_Qty":1.0
        }
    ],
    "StoreId":"1234",
    "dob":"20191024",
    "Order_Mode_Id":"3",
    "checknumber":"54321"
}

Компакт:

{"Revenue_Label":"Dining Room","StoreName":"STORE A","Revenue_Id":"1","Alteration_Flag":"False","Order_Mode_Label":"DriveThru","checkClosetime":"2019-10-24T13:43:19+13:00","Alterations":[{"Alteration_Product_Code":"211136","Alteration_Product_Net_Amount":0.0,"Altered_Product_Code":"211135","Alteration_Product_Amount":0.0,"Altered_Product_Name":"Burger","Alteration_Product_Name":"Add Sauce","Alteration_Product_Qty":1.0}],"StoreId":"1234","dob":"20191024","Order_Mode_Id":"3","checknumber":"54321"}
...