使用 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;

每一行都可以独立处理,所以这应该是最快的方法。