Google bigquery 将JSON加载到bigquery-field有时是数组,有时是字符串

Google bigquery 将JSON加载到bigquery-field有时是数组,有时是字符串,google-bigquery,Google Bigquery,我正在尝试将JSON数据加载到BigQuery。导致问题的我的数据摘录如下所示: {"page":"295"} {"page":["295", "123"]} 我已将此字段的架构定义为: { "name": "page", "type": "string", "mode": "repeated" } 我得到一个错误“重复字段必须作为JSON数组导入。”我认为问题是由JSON本身的结构引起的。第一行中的字符串应该是1个元素数组,而不仅仅是一个字符串。数据是这样传递给我的。我试图找到

我正在尝试将JSON数据加载到BigQuery。导致问题的我的数据摘录如下所示:

{"page":"295"}
{"page":["295", "123"]}
我已将此字段的架构定义为:

{
  "name": "page",
  "type": "string",
  "mode": "repeated"
}

我得到一个错误“重复字段必须作为JSON数组导入。”我认为问题是由JSON本身的结构引起的。第一行中的字符串应该是1个元素数组,而不仅仅是一个字符串。数据是这样传递给我的。我试图找到一种方法来强制BigQuery将这个字符串作为一个元素数组来读取,而不是修复这个文件(它是数百GB)。有什么解决方案吗?

一种选择是使用BigQuery转换数据本身。假设您可以将行作为CSV导入(选择数据中未出现的任意分隔符),您可以使用
JSON\u EXTRACT
函数跨行检索
页面
的值。比如说,

#standardSQL
SELECT JSON_EXTRACT(json, '$.page') AS page
FROM UnprocessedTable;
您可以使用
SPLIT
函数或
REGEXP\u EXTRACT\u ALL
在之后检索各个值

编辑:作为一个具体示例,您可以尝试以下查询:

#standardSQL
WITH T AS (
  SELECT '{"page": "foo"}' AS json UNION ALL
  SELECT '{"page": ["bar", "baz"]}' AS json UNION ALL
  SELECT '{"page": ["a", "b", "c"]}' AS json
)
SELECT
  REGEXP_EXTRACT_ALL(JSON_EXTRACT(json, '$.page'), r'"([^"]*)"') AS pages
FROM T;

这会将JSON数组(或标量字符串)作为
数组
列返回。

谢谢!这确实可行。问题是我的数据实际上包含大约60列。给出的示例只是导致问题的列。我应该早点提的。在将整个数据集加载为CSV后,我需要分别提取每一列(即使是现在工作正常的列),这一点是否正确?您可以通过编程方式生成一个查询,为其他每一列调用
JSON\u extract\u SCALAR
。您应该只需要对数据进行一次转换,至少一次。谢谢。另一个对我有效的解决方案是将整个数组
[“295”,“123”]
作为字符串加载。这有可能吗?这会更容易吗?我想这样做也可能会出错,因为类型将被声明为字符串,但您可以尝试一下并查看。如果您能够将其作为字符串加载,则可以像上面的示例一样使用
REGEXP\u EXTRACT\u ALL
。不幸的是,我无法将其作为可为空的字符串加载。获取为非重复字段指定的数组的明显错误。是否有其他方法可以实现不包括将行导入为CSV的目标?