Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Bigquery-将数组转换为列_Arrays_Google Bigquery_Transpose - Fatal编程技术网

Arrays Bigquery-将数组转换为列

Arrays Bigquery-将数组转换为列,arrays,google-bigquery,transpose,Arrays,Google Bigquery,Transpose,以下查询返回键/值对的列表: SELECT ["name:apple", "color:red"] as fruit; 结果: 是否有一种方法可以将数据转换为: 更新 我正在寻找一个通用的解决方案,其中键和值以及结果的数组长度未知,即:SELECT[“key0:val0”,“key1:val1”…]作为数据不确定是否有更简洁的方法可以做到这一点,但这是可行的 WITH CTE AS ( SELECT ["name:apple", "color:red"] as fruit UNION AL

以下查询返回键/值对的列表:

SELECT ["name:apple", "color:red"] as fruit;
结果:

是否有一种方法可以将数据转换为:

更新
我正在寻找一个通用的解决方案,其中键和值以及结果的数组长度未知,即:
SELECT[“key0:val0”,“key1:val1”…]作为数据

不确定是否有更简洁的方法可以做到这一点,但这是可行的

WITH CTE AS (
SELECT ["name:apple", "color:red"] as fruit
UNION ALL
SELECT ["name:pear", "color:green"]
),

CTE2 AS (
SELECT row_number() over () as rowNumber, fruit
FROM CTE
)

SELECT max(if(REGEXP_CONTAINS(fruit,'name:'),replace(fruit,'name:',''),null)) name,
  max(if(REGEXP_CONTAINS(fruit,'color:'),replace(fruit,'color:',''),null)) color
FROM CTE2,
UNNEST(fruit) as fruit
GROUP BY rowNumber

我猜BigQuery的方法是在数组上使用子选择:

WITH t AS (SELECT * FROM UNNEST([ 
    struct(['name:apple','color:red'] AS fruit), 
    struct(['name:pear','color:purple'] AS fruit)
  ]) )

SELECT
  (SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='name') AS name,
  (SELECT SPLIT(f, ':')[SAFE_OFFSET(1)] FROM t.fruit f WHERE SPLIT(f, ':')[SAFE_OFFSET(0)]='color') AS color
FROM t

这应该是一种快速实现结果的方法:

#standardSQL
with items as (
  select ["name:apple", "color:red"] p union all
  select ["name:orange", "color:orange"] UNION ALL
  select ["name:grapes", "color:green"]
),
arrayed as (
  select 
    array_agg(
       struct(
        if(split(p, ":")[offset(0)] = 'name', split(p, ":")[offset(1)], '') as name, 
        if(split(p, ":")[offset(0)] = 'color', split(p, ":")[offset(1)], '') as color 
      )
    ) item  from items, unnest(p) p
)
select 
  array((select i.name from unnest(item) i where i.name != '')) as name,
  array((select i.color from unnest(item) i where i.color != '')) as color
from arrayed

由于这些数据结构的性质,这是不可能的:数组具有动态数量的元素,而结构或表具有键的元素,这些键的模式需要在多行上保持一致。您需要编写一个查询来编写查询。。。请看这里@MikhailBerlyant的答案