BQ 加载带有数组数组的 JSON 文件

Posted

技术标签:

【中文标题】BQ 加载带有数组数组的 JSON 文件【英文标题】:BQ load JSON File with Array of Array 【发布时间】:2020-01-30 12:35:25 【问题描述】:

我正在尝试加载一些数组为空的 JOSN 文件。

"house_account_payable":"0.00","house_account_receivable":"0.00","gift_sales_payable":"0.00","gift_sales_receivable":"0.00","store_credit_sales_payable":"0.00","percentage_row":null,"sales_per_period":[["02:00AM - 02:59AM","amount":0,"qty":0],["03:00AM - 03:59AM","amount":0,"qty":0]],"revenue_centers":[],"tax_breakdowns":[]

这给出了错误:

rror while reading table: test2, error message: Failed to parse JSON: No object found when new array is started.; BeginArray returned false; Parser terminated before end of string

有人可以帮我解决这个问题吗?

【问题讨论】:

对象.....的开启和关闭应该在同一行。请参阅***.com/a/54658959/132438 进行修复 @FelipeHoffa 我已经更新了完整的 JSON 文件,它实际上是嵌套的。 【参考方案1】:

您是否尝试从本地计算机或 GCS 加载数据?请记住在JSONL(Newline delimited JSON) 中导出:

"open_orders_ids": []
"unpaid_orders_ids": []

输出:

查看documentation 关于嵌套和重复列的信息。

编辑:

您的 JSON 架构应如下所示:


    "items": [
        
            "house_account_payable": "0.00",
            "house_account_receivable": "0.00",
            "gift_sales_payable": "0.00",
            "gift_sales_receivable": "0.00",
            "store_credit_sales_payable": "0.00",
            "percentage_row": "",
            "sales_per_period": [
                
                    "AM02_00_AM02_59": 
                        "amount": "0",
                        "qty": "0"
                    
                ,
                
                    "AM03_00_AM03_59": 
                        "amount": "0",
                        "qty": "0"
                    
                
            ]
        
        ]

关于 Felipe Hoffa 的post,运行以下命令:

jq -c  .items[] <FILENAME>.json  > <FILENAME>.jq.json
bq load --source_format NEWLINE_DELIMITED_JSON --autodetect <DATASET_ID>.<TABLENAME> <FILENAME>.jq.json

架构:

如果这就是你要找的,请告诉我。

【讨论】:

我已经用完整的 JSON 文件更新了问题。 我已经更新了我的答案,让我知道结果。【参考方案2】:

空数组没有问题。

问题在于这个较短的json:

"sales_per_period":[["02:00AM - 02:59AM","amount":0,"qty":0],["03:00AM - 03:59AM","amount":0,"qty":0]]

那里的数组包含不同类型的元素,要将其放入结构化表中,需要不同的架构。

例如:

"sales_per_period":["a":"02:00AM - 02:59AM","b":"amount":0,"qty":0,"a":"03:00AM - 03:59AM","b":"amount":0,"qty":0]

现在这很容易加载到 BigQuery 中:

bq load --source_format=NEWLINE_DELIMITED_JSON --autodetect temp.short delete.short.json

您能否在 BigQuery 之外轻松更改此源 JSON?否则将其原始加载到 BigQuery 中,并使用 BigQuery 中的 JS UDF 对其进行解析。

【讨论】:

我尝试用字符串加载它,但它不起作用,我可以加载原始数据。但是我应该使用什么数据类型? 加载为csv,带有自定义字段分隔符\0

以上是关于BQ 加载带有数组数组的 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pig Latin 中每行加载一个带有 JSON 数组的文件

使用 bq load 加载带有 NULL 列的 CSV

如何使用 javascript 解析带有数组的外部 JSON 文件

使用带有数组的 NSDictionary 创建 JSON 文件

如何从 XSD 创建 BQ 模式

如何使用带有交叉应用的 SQL OPENJSON 函数测量 json 文件中数组内数组的长度