Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用Nifi将带有数组的json插入BigQuery时出现问题_Arrays_Json_Google Bigquery_Apache Nifi - Fatal编程技术网

Arrays 使用Nifi将带有数组的json插入BigQuery时出现问题

Arrays 使用Nifi将带有数组的json插入BigQuery时出现问题,arrays,json,google-bigquery,apache-nifi,Arrays,Json,Google Bigquery,Apache Nifi,我试图使用Nifi处理器PutBigQueryBatch 1.9.2将下面的json数据插入到bigquery表中 { "Revenue_Label": "Dining Room", "StoreName": "STORE A", "Revenue_Id": "1", "Alteration_Flag": "False", "Order_Mode_Label": "DriveThru", "checkClosetime": "2019-1

我试图使用Nifi处理器PutBigQueryBatch 1.9.2将下面的json数据插入到bigquery表中

{    
"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:记录字段必须至少有一个 子字段:java.lang.IllegalArgumentException:记录字段必须 至少有一个子字段

在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" }
 ]
我尝试过的:

  • 从json flowflie中删除了所有空格和回车字符
  • 在json文件的开头和结尾尝试了数组,并将BigQuery表与此匹配
  • 已将项的名称更改为不包含下划线
  • 一次生成一列插入,仅在数组存在时失败
  • 使用实用程序“bq show--schema--format=prettyjson”时,直接使用从Google Cloud BigQuery生成的模式定义
  • 将每个数组项的模式定义为REQUIRED而不是NULLABLE
  • 从Nifi中PutBigQueryBatch进程的属性中的模式定义中删除了所有空格和回车字符
  • 所有这些都导致了与上述相同的错误

    注意 在nifi进程的其他地方,我成功地使用了PutBigQueryBatch进程并更新了表。区别在于json没有数组

    是否有人对如何解决此问题有任何想法?

    从中,您的原始定义看起来是正确的。不知何故,空格或制表符可能会出错,请尝试使用更格式化的空格或制表符

    漂亮的:

    { 
        "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"}
    

    根据您的帖子,我可以看到您在模式定义中将重复字段定义为变更;然而,在您用来上传数据的JSON中,该字段显示为变更

    至少
    变更
    数组未关闭。嗨,daggett-谢谢您的回复。我有点c你说的“改变”是什么意思“阵列未关闭。需要关闭的是模式定义还是json文件?你能提供一个它应该是什么的例子吗?非常感谢。Tim@TimManger你没有找到解决这个问题的办法吗?我遇到了类似的问题。我可以手动加载模式json以在GCP控制台中生成表,但如果我尝试通过PutBigQueryBatch执行此操作,它将在模式的同一记录部分失败。当手动创建表时,所有记录都可以写入其中而不会出现任何问题。我所做的是在GCP中创建一个主题和订阅,然后使用nifi中的PublishGCPubSub进程将json流文件传递给PubSub。在此基础上,我编写了一个云函数,当jason文件到达队列主题并将json文件插入bigquery.Lamus中的表时触发了该函数-感谢您的回复。模式的定义是什么,转换数组会排除“字段”,还是我必须更改json文件来包含它?嗨,拉莫斯-你在“尝试这个”之后错过了一个链接吗?不,我修改了我的答案。嗨,拉莫斯-谢谢你的建议。遗憾的是,它没有起作用。我在第8行得到了错误“待定数组”。这对应于第{“mode”:“REPEATED”,“name”:“alterations”,“type”:“RECORD”行",…这定义了模式中的数组。我将继续寻找解决方案。啊,我错过了模式
    REPEATED
    ,这意味着字段应该是数组。嗨,ebeltran-谢谢你发现了这一点。我将拼写改为两个匹配。但是,遗憾的是,我仍然得到了相同的错误。我开始认为可能有一个错误,我不知道n PutBigQueryBatch 1.9.2 nifi处理器。