在 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 将宽表转换为长表