在 BigQuery 中将长表转换为宽表

Posted

技术标签:

【中文标题】在 BigQuery 中将长表转换为宽表【英文标题】:Convert Long table to wide table in BigQuery 【发布时间】:2020-06-22 15:11:57 【问题描述】:

我有一个这样的 BigQuery 表:

要求的输出是:

注意: Extended_property_key 列的keys 不是固定的,一直在频繁添加。因此,Output 中的列也会不断添加。

我需要构建一个 Bigquery,它可以处理在输出查询中动态添加列以及旋转。

【问题讨论】:

任何人都可以帮助解决上述问题。我已经尝试了许多使用 ANY_VALUE() 聚合函数的选项,但这是我不想要的。 你检查过这个 thread 解释 Biqgquery 旋转技术中的不同方法吗? 【参考方案1】:

以下是 BigQuery 标准 SQL

EXECUTE IMMEDIATE '''
SELECT account_id, ''' || (
  SELECT STRING_AGG(DISTINCT "MAX(IF(Extended_property_key = '" || Extended_property_key || "', Extended_property_value, NULL)) AS " || Extended_property_key)
  FROM `project.dataset.table`
) || '''  
FROM `project.dataset.table`
GROUP BY 1
ORDER BY 1
'''   

如果应用于您问题中的样本数据 - 输出是

Row account_id  Key1    Key2    Key3     
1   1           Value1  null    null     
2   7           null    Value2  Value3   

【讨论】:

我希望参数化上述查询,因为许多操作员都存在同一个表。示例 - dataset1.table1、dataset2.table1、dataset3.table1。在这种情况下,我想将上述查询作为模板查询,并将主键和表名作为参数传递。这样同一个查询可以用于多个运算符。我尝试使用 Airflow BigQueryOperator,但该运算符不提供参数化。【参考方案2】:

试试:

CALL fhoffa.x.pivot(
  'p.d.t1' # source table
  , 'p.d.t2' # destination table
  , ['ACCOUNT_ID'] # row_ids
  , 'EXTENDED_PROPERTY_KEY' # pivot_col_name
  , 'EXTENDED_PROPERTY_VALUE' # pivot_col_value
  , 30 # max_columns
  , 'ANY_VALUE' # aggregation
  , '' # optional_limit
);

关于如何旋转的更多细节:

https://towardsdatascience.com/easy-pivot-in-bigquery-one-step-5a1f13c6c710

【讨论】:

感谢此链接。我知道在这一步中,您使用聚合函数获取不同的值,而外部查询正在循环这些值。我正在尝试创建没有字符串连接的确切查询,但由于缺少引号而出现错误。立即执行 ("SELECT STRING_AGG(' "||聚合 ||"""(IF('||@pivot_col_name||'="'||x.value||'", '||@pivot_col_value||', null)) e_'||fhoffa.x.normalize_col_name(x.value)) FROM UNNEST(( SELECT APPROX_TOP_COUNT("""||pivot_col_name||", @max_columns) FROM "||table_name||")) x" ) 请发布一个新问题,以便我们有足够的空间查看代码并修复它:) 我在这里发布了一个新问题 [link]***.com/questions/62659762/… 请检查并提供有关在您的存储过程链接中运行的底层查询的说明

以上是关于在 BigQuery 中将长表转换为宽表的主要内容,如果未能解决你的问题,请参考以下文章

R语言使用tidyr包的spread函数将dataframe数据从长表变换为宽表(long format to wide format)

R语言将dataframe长表转化为宽表实战:使用reshape函数使用tidyr包的spread函数使用data.table

R语言使用across函数一次性将多个数据列进行离散化(categorize):或者pivot_longer函数转化为长表对转化为长表的数值数据列进行离散化pivot_wider将数据转化为宽表

使用 INNER JOIN LATERAL 和 postgresql 将宽表转换为长表

R语言tidyr包pivot_longer函数pivot_wider函数数据表变换实战(长表到宽表宽表到长表)

R语言获得所有Aesthetics(美学映射)参数:使用长表输出使用宽表输出