使用含有空值的json数据进行导入

3
从BigQuery的导入文档中可以看到,

注意:不允许使用Null值。

因此我假设在导入BigQuery时,json格式的数据中不允许使用null。然而,在常规的ETL任务中,null值实际上非常常见(由于数据缺失)。那么应该如何导入这种包含null值得JSON源文件呢?请注意,我的数据包含嵌套结构,因此我不希望将其转换为CSV并使用,,表示null值。
我认为可以采取的一种方法是将所有的null值替换为不同数据类型的默认值,例如:
  • 字符串: null -> 空字符串
  • 整数: null -> -1
  • 浮点数: null -> -1.0
  • ...
但我不喜欢这种方法。我正在寻找更好的选择。
顺便说一句,我尝试使用一个包含null值的json文件进行bq load操作。但我遇到了下面的错误:
Failure details:
- Expected '"' found 'n'
- Expected '"' found 'n'
- Expected '"' found 'n'
- Expected '"' found 'n'
- Expected '"' found 'n
...

我认为这是使用null的指示,这正确吗?

编辑:如果我删除所有的null字段,似乎可以正常工作。我猜这是处理null数据的方法。您不能为数据字段设置null,但可以不包含它。因此,我需要编写过滤代码来移除原始json中的所有null字段。


JSON语法中允许使用NULL。不同的JSON包使用不同的软件结构来表示NULL,可以是显式的NULL对象,也可以是类似于空数组的东西。但是你引用的消息并没有告诉我们太多信息。 - Hot Licks
但请注意,JSON仅是一种数据格式 - 它不描述语义,数据的语义必须由“对话”的两端达成一致。如果NULL不在达成一致的语义中,则JSON与其无关。 “BigQuery”文档定义了一些相当受限制的语义。 - Hot Licks
是的,这可能是BigQuery导入的限制。我只想知道是否有任何聪明的方法可以避免这种限制。 - greeness
你可以使用一些东西(例如一个空数组)作为“替身”。虽然我不太清楚BigQuery在做什么,或者你在用它做什么,但你必须查看你对它的使用,以了解你可以玩哪些技巧。 - Hot Licks
(请注意,在JSON中,没有要求特定的数据项必须是特定类型。例如,“phone_number”可以是字符一次,整数下一次,数组(甚至“对象”)第三次。因此,为了表示“null”整数,您不必使用整数值。) - Hot Licks
显示剩余2条评论
1个回答

4
你可以使用JSON格式的源文件导入NULL值,对于值为NULL的情况,省略键:值对即可。
例如 - 假设你有以下模式:
{
"name": "kind",
"type": "string"
},
{
"name": "fullName",
"type": "string",
},
{
"name": "age",
"type": "integer",
"mode": "nullable"
}

没有NULL值的记录可能是这样的:
{"kind": "person",
 "fullName": "Some Person",
 "age": 22
}

然而,当 "age" 为空时,请尝试使用以下方法(注意,不需要 "age" 键):
{"kind": "person",
 "fullName": "Some Person",
}

如果您在使用 JSON 导入格式时遇到问题,请告知我们。我会记录下来并改进有关使用 NULL 值的文档。


谢谢。这证实了我需要省略空的 (key,value) 对。 - greeness
如果预处理上传涉及到数千兆字节的数据,这并没有什么帮助。例如,当从Web服务器加载点击数据的日志文件时。 - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接