【问题标题】:Import json data with null values导入具有空值的 json 数据
【发布时间】:2012-10-27 01:40:46
【问题描述】:

来自 BigQuery 的 import 文档,

注意:不允许空值

所以我假设 null 在用于 BigQuery 导入的 json 格式数据中是不允许的。但是,null 值实际上在常规 ETL 任务中非常常见(由于缺少数据)。导入此类 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 对象,要么是类似空数组的东西。但你引用的信息很少告诉我们。
  • 但是注意JSON只是一种数据格式——它不描述语义,数据的语义必须得到“对话”两端的同意。如果 NULL 不在约定的语义中,则 JSON 与它无关。 “BigQuery”文档定义了一些相当受限的语义。
  • 是的,这可能是 BigQuery 导入的限制。我只是想知道是否有任何聪明的方法可以避免限制。
  • 您可以使用某些东西(例如,一个空数组)作为“替身”。不过,我真的不知道 BigQuery 在做什么,也不知道你在用它做什么——你必须看看你对它的使用,看看你可以玩什么花样。
  • (请注意,在 JSON 中,不要求特定数据项是特定类型。例如,“phone_number”可以是字符一次,下一次是整数,以及一个数组(或即使是“object”)第三次。因此,要表示“null”整数,您不必使用整数值。

标签: json null google-bigquery data-import


【解决方案1】:

您可以使用 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" 为 NULL 时,试试这个(注意,没有 "age" 键):

{"kind": "person",
 "fullName": "Some Person",
}

如果您对此有任何疑问,请告诉我们。我将做笔记以改进有关使用 JSON 导入格式的 NULL 值的文档。

【讨论】:

  • 谢谢。这证实了我需要省略 null (key,value) 对。
  • 如果上传的预处理涉及许多 GB 的数据,这将无济于事。例如,当从 Web 服务器加载点击数据的日志文件时
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2013-03-27
  • 2017-12-20
  • 2013-06-01
相关资源
最近更新 更多