使用 PIVOT 将数组扩展为 BigQuery 中的列
Using PIVOT to Expand Arrays into Columns in BigQuery
我有一个相当紧凑的数据集,除了它似乎使用 AutoML 进行训练外,它对所有内容都非常有用,因此我需要取消嵌套数据以便能够 运行 在其上进行 ML 训练。
我的数据布局为 4 列,前 3 列各为 6 个元素的数组:
或 JSON:
{
"vRMSMin":[245.484,245.571,245.477,245.505,245.47,245.557],
"vRMSMax":[246.63,246.583,246.662,246.601,246.599,246.455],
"eReactiveNegativeKwh":[0.0179,0.0086,0.0142,0.0024,0.0188,0.0097],
"timestamp": "1629861271"
}
我已经尝试对这些使用 UNNEST 和 CROSS JOIN,但是由于我将拥有大量输出列和数据量,查询可能无法完成,所以我正在考虑使用 PIVOT 但找不到足够的文档关于如何使用它来获得期望的结果:
vRMSMin_0,vRMSMin_1,vRMSMin_2,vRMSMin_3,vRMSMin_4,vRMSMin_5,vRMSMax_0,vRMSMax_1,vRMSMax_2,vRMSMax_3,vRMSMax_4,vRMSMax_5,....etc
请注意 - 这与创建 PIVOT table 不是同一个问题(因此不是我拥有的所有其他答案的副本搜索),我特别询问如何在数组上使用 PIVOT 函数来生成列,而不是使用行来创建其他列。
在我的大脑融化之前,我已经到了这里附近的某个地方:
SELECT * FROM (
SELECT vRMSMin, vRMSMax
FROM mydata.data
)
PIVOT
(
MIN( (SELECT SUM(x) FROM UNNEST(vRMSMin) x))
FOR vRMSMin[offset()] in (0,1,2,3,4,5)
)
我主要是在为如何获取列名和值而苦苦挣扎,可能是我对 BigQuery 的要求太多了,应该在客户端中单独处理,但这意味着双重导入,我更喜欢如果可能的话,能够通过 ELT 处理这个问题。
使用下面的方法作为示例(很容易根据需要使用尽可能多的额外列进行扩展)
with `mydata.data` as (
select 1 id, [245.484,245.571,245.477,245.505,245.47,245.557] as vRMSMin,
[246.63,246.583,246.662,246.601,246.599,246.455] vRMSMax union all
select 2, [145.484,145.571,145.477,145.505,145.47,145.557] ,
[146.63,146.583,146.662,146.601,146.599,146.455]
)
select *
from (
select id, a, b, offset
from `mydata.data`,
unnest(vRMSMin) a with offset
join unnest(vRMSMax) b with offset
using (offset)
)
pivot (min(a) as vRMSMin, min(b) as vRMSMax for offset in (0, 1, 2, 3, 4, 5))
有输出
为什么你会为此使用数组索引以外的任何东西?
select timestamp,
vRMSMin[Ordinal(1)], vRMSMin[Ordinal(2)], vRMSMin[Ordinal(3)], vRMSMin[Ordinal(4)], vRMSMin[Ordinal(5)], vRMSMin[Ordinal(6)],
vRMSMax[Ordinal(1)], vRMSMax[Ordinal(2)], vRMSMax[Ordinal(3)], vRMSMax[Ordinal(4)], vRMSMax[Ordinal(5)], vRMSMax[Ordinal(6)],
eReactiveNegativeKwh[Ordinal(1)], eReactiveNegativeKwh[Ordinal(2)], eReactiveNegativeKwh[Ordinal(3)], eReactiveNegativeKwh[Ordinal(4)], eReactiveNegativeKwh[Ordinal(5)], eReactiveNegativeKwh[Ordinal(6)]
from mydata.data;
每一行都可以独立处理,所以这应该是最快的方法。
我有一个相当紧凑的数据集,除了它似乎使用 AutoML 进行训练外,它对所有内容都非常有用,因此我需要取消嵌套数据以便能够 运行 在其上进行 ML 训练。
我的数据布局为 4 列,前 3 列各为 6 个元素的数组:
或 JSON:
{
"vRMSMin":[245.484,245.571,245.477,245.505,245.47,245.557],
"vRMSMax":[246.63,246.583,246.662,246.601,246.599,246.455],
"eReactiveNegativeKwh":[0.0179,0.0086,0.0142,0.0024,0.0188,0.0097],
"timestamp": "1629861271"
}
我已经尝试对这些使用 UNNEST 和 CROSS JOIN,但是由于我将拥有大量输出列和数据量,查询可能无法完成,所以我正在考虑使用 PIVOT 但找不到足够的文档关于如何使用它来获得期望的结果:
vRMSMin_0,vRMSMin_1,vRMSMin_2,vRMSMin_3,vRMSMin_4,vRMSMin_5,vRMSMax_0,vRMSMax_1,vRMSMax_2,vRMSMax_3,vRMSMax_4,vRMSMax_5,....etc
请注意 - 这与创建 PIVOT table 不是同一个问题(因此不是我拥有的所有其他答案的副本搜索),我特别询问如何在数组上使用 PIVOT 函数来生成列,而不是使用行来创建其他列。
在我的大脑融化之前,我已经到了这里附近的某个地方:
SELECT * FROM (
SELECT vRMSMin, vRMSMax
FROM mydata.data
)
PIVOT
(
MIN( (SELECT SUM(x) FROM UNNEST(vRMSMin) x))
FOR vRMSMin[offset()] in (0,1,2,3,4,5)
)
我主要是在为如何获取列名和值而苦苦挣扎,可能是我对 BigQuery 的要求太多了,应该在客户端中单独处理,但这意味着双重导入,我更喜欢如果可能的话,能够通过 ELT 处理这个问题。
使用下面的方法作为示例(很容易根据需要使用尽可能多的额外列进行扩展)
with `mydata.data` as (
select 1 id, [245.484,245.571,245.477,245.505,245.47,245.557] as vRMSMin,
[246.63,246.583,246.662,246.601,246.599,246.455] vRMSMax union all
select 2, [145.484,145.571,145.477,145.505,145.47,145.557] ,
[146.63,146.583,146.662,146.601,146.599,146.455]
)
select *
from (
select id, a, b, offset
from `mydata.data`,
unnest(vRMSMin) a with offset
join unnest(vRMSMax) b with offset
using (offset)
)
pivot (min(a) as vRMSMin, min(b) as vRMSMax for offset in (0, 1, 2, 3, 4, 5))
有输出
为什么你会为此使用数组索引以外的任何东西?
select timestamp,
vRMSMin[Ordinal(1)], vRMSMin[Ordinal(2)], vRMSMin[Ordinal(3)], vRMSMin[Ordinal(4)], vRMSMin[Ordinal(5)], vRMSMin[Ordinal(6)],
vRMSMax[Ordinal(1)], vRMSMax[Ordinal(2)], vRMSMax[Ordinal(3)], vRMSMax[Ordinal(4)], vRMSMax[Ordinal(5)], vRMSMax[Ordinal(6)],
eReactiveNegativeKwh[Ordinal(1)], eReactiveNegativeKwh[Ordinal(2)], eReactiveNegativeKwh[Ordinal(3)], eReactiveNegativeKwh[Ordinal(4)], eReactiveNegativeKwh[Ordinal(5)], eReactiveNegativeKwh[Ordinal(6)]
from mydata.data;
每一行都可以独立处理,所以这应该是最快的方法。