Arrays 将嵌套数组加载到bigquery中
我有JSON格式的数据,其中包含嵌套数组。下面是一个例子: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的
"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中,但不清楚最终的表是什么-提供示例!还不清楚最终的表格是什么-请提供示例!