Arrays 将嵌套数组加载到bigquery中

Arrays 将嵌套数组加载到bigquery中,arrays,json,google-bigquery,Arrays,Json,Google Bigquery,我有JSON格式的数据,其中包含嵌套数组。下面是一个例子: "data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963],... 子数组的长度可以是3或4,第一个数字是数据类型(大约有30个不同的)。有没有办法将这些数据加载到bigQuery而不转换为字典“记录” 谢谢, 亚龙 --编辑-- 有一个问题,这有一个解决办法,但有一个固定长度的子阵列,所以我想不适用 无法直接加载数组的数组;您需要使用记录来包装数组的内部级别。标准SQL的

我有JSON格式的数据,其中包含嵌套数组。下面是一个例子:

"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963],...
子数组的长度可以是3或4,第一个数字是数据类型(大约有30个不同的)。有没有办法将这些数据加载到bigQuery而不转换为字典“记录”

谢谢, 亚龙

--编辑--


有一个问题,这有一个解决办法,但有一个固定长度的子阵列,所以我想不适用

无法直接加载数组的数组;您需要使用记录来包装数组的内部级别。标准SQL的参考涉及到这一点(尽管是语言本身,而不是加载数据):。

不可能直接加载数组的数组;您需要使用记录来包装数组的内部级别。标准SQL的参考涉及到这一点(尽管是语言本身,而不是加载数据):。

这可能是错误的方向,因为不完全清楚您的最终目标是什么,但让我试着帮助您
不知怎的,我觉得你的目的地表应该是下面这样的

type    metric1 metric2 metric3  
   1       1271     518     945  
   1       1287     495     963  
因此,我的建议是分两步完成

步骤1-将数据作为CSV加载,只需一个字段-假设表格
表格
包含字段
数据

                              data
 {"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}
 {"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}} 
步骤2-处理
表格
,以生成预期的模式(请参见答案顶部),并保存到最终表格中。您可以使用下面的查询进行此操作

SELECT
  NTH(1, SPLIT(y)) AS type,
  NTH(2, SPLIT(y)) AS metric1,
  NTH(3, SPLIT(y)) AS metric2,
  NTH(4, SPLIT(y)) AS metric3,
FROM (
  SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y  
  FROM (
    SELECT
      IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
      IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
      IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
      IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
      IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
      IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
      IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
    FROM theTable AS a
    CROSS JOIN (
      SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
      (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
    ) AS b
  )
  HAVING NOT y IS NULL
)
结果将是

type    metric1 metric2 metric3  
   1       1271     518     945  
   1       1287     495     963  
   2        111     222     333  
   3        444     555     666  
   4        777     888     999  
正如您所看到的,这个特定的查询最多支持7个子数组,但是您可以通过在三个位置更改代码来减少或增加子数组

#一,

#二,

#三,

最后,为了测试转换逻辑,不加载实际数据-您可以使用下面的脚本

SELECT
  NTH(1, SPLIT(y)) AS type,
  NTH(2, SPLIT(y)) AS metric1,
  NTH(3, SPLIT(y)) AS metric2,
  NTH(4, SPLIT(y)) AS metric3,
FROM (
  SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y  
  FROM (
    SELECT
      IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
      IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
      IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
      IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
      IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
      IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
      IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
    FROM (
    SELECT data FROM 
      (SELECT '{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}' AS data),
      (SELECT '{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}}' AS data) 
    ) AS a
    CROSS JOIN (
      SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
      (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
    ) AS b
  )
  HAVING NOT y IS NULL
)

希望这是有帮助的

这可能是个错误的方向,因为你的最终目标还不完全清楚,但让我来帮你
不知怎的,我觉得你的目的地表应该是下面这样的

type    metric1 metric2 metric3  
   1       1271     518     945  
   1       1287     495     963  
因此,我的建议是分两步完成

步骤1-将数据作为CSV加载,只需一个字段-假设表格
表格
包含字段
数据

                              data
 {"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}
 {"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}} 
步骤2-处理
表格
,以生成预期的模式(请参见答案顶部),并保存到最终表格中。您可以使用下面的查询进行此操作

SELECT
  NTH(1, SPLIT(y)) AS type,
  NTH(2, SPLIT(y)) AS metric1,
  NTH(3, SPLIT(y)) AS metric2,
  NTH(4, SPLIT(y)) AS metric3,
FROM (
  SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y  
  FROM (
    SELECT
      IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
      IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
      IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
      IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
      IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
      IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
      IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
    FROM theTable AS a
    CROSS JOIN (
      SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
      (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
    ) AS b
  )
  HAVING NOT y IS NULL
)
结果将是

type    metric1 metric2 metric3  
   1       1271     518     945  
   1       1287     495     963  
   2        111     222     333  
   3        444     555     666  
   4        777     888     999  
正如您所看到的,这个特定的查询最多支持7个子数组,但是您可以通过在三个位置更改代码来减少或增加子数组

#一,

#二,

#三,

最后,为了测试转换逻辑,不加载实际数据-您可以使用下面的脚本

SELECT
  NTH(1, SPLIT(y)) AS type,
  NTH(2, SPLIT(y)) AS metric1,
  NTH(3, SPLIT(y)) AS metric2,
  NTH(4, SPLIT(y)) AS metric3,
FROM (
  SELECT 
    REPLACE(REPLACE(COALESCE(y0, y1, y2, y3, y4, y5, y6), '[', ''), ']', '') AS y  
  FROM (
    SELECT
      IF(k=0, JSON_EXTRACT(data, '$.data.events[0]'), NULL) AS y0,
      IF(k=1, JSON_EXTRACT(data, '$.data.events[1]'), NULL) AS y1,
      IF(k=2, JSON_EXTRACT(data, '$.data.events[2]'), NULL) AS y2,
      IF(k=3, JSON_EXTRACT(data, '$.data.events[3]'), NULL) AS y3,
      IF(k=4, JSON_EXTRACT(data, '$.data.events[4]'), NULL) AS y4,
      IF(k=5, JSON_EXTRACT(data, '$.data.events[5]'), NULL) AS y5,
      IF(k=6, JSON_EXTRACT(data, '$.data.events[6]'), NULL) AS y6,
    FROM (
    SELECT data FROM 
      (SELECT '{"data": {"events": [[1, 1271, 518, 945], [1, 1287, 495, 963]]}}' AS data),
      (SELECT '{"data": {"events": [[2, 111, 222, 333], [3, 444, 555, 666], [4, 777, 888, 999]]}}' AS data) 
    ) AS a
    CROSS JOIN (
      SELECT k FROM (SELECT 0 AS k), (SELECT 1 AS k), (SELECT 2 AS k), 
      (SELECT 3 AS k), (SELECT 4 AS k), (SELECT 5 AS k), (SELECT 6 AS k)
    ) AS b
  )
  HAVING NOT y IS NULL
)

希望这是有帮助的

谢谢你的回答。我试图避免在数据上运行转换以将其转换为记录/结构。有没有办法将这个嵌套数组作为字符串/文本blob上传?这个问题可能会有所帮助:您可以将它作为字符串加载,然后使用BigQuery的JSON函数提取您想要作为查询一部分的部分。我有一个摘要问题,我只想将嵌套数组加载到BQ中。json行看起来像
{“data”:{“events”:[[11271518945],[11287495963]}
我想把它加载到BQ中,谢谢你的回答。我试图避免在数据上运行转换以将其转换为记录/结构。有没有办法将这个嵌套数组作为字符串/文本blob上传?这个问题可能会有所帮助:您可以将它作为字符串加载,然后使用BigQuery的JSON函数提取您想要作为查询一部分的部分。我有一个摘要问题,我只想将嵌套数组加载到BQ中。json行看起来像
{“data”:{“events”:[[11271518945],[11287495963]}
我想把它加载到BQ中,但不清楚最终的表是什么-提供示例!还不清楚最终的表格是什么-请提供示例!