在bigquery中,如果我们对构造json输出感兴趣,通常可以在事先知道key的情况下对json对象使用struct。
SELECT TO_JSON_STRING(STRUCT(key1))
FROM (SELECT "val1" as key1 UNION ALL
SELECT "val2" as key1)
Result
{"key1":"val1"}
{"key1":"val2"}
但是在key是动态的情况下,我们真的想要一个map类型,类似于avro map type例如
SELECT *
FROM (SELECT "key1" as key, "val1" as val UNION ALL
SELECT "key2" as key, "val2" as val)
should return
{"key1": "val1", "key2": "val2"}
有没有办法使用 BigQuery SQL 实现这一点?
最佳答案
下面是 BigQuery 标准 SQL
像下面这样简单的东西应该会产生预期的结果
#standardSQL
WITH `project.dataset.table` AS (
SELECT "key1" AS key, "val1" AS val UNION ALL
SELECT "key2" AS key, "val2" AS val
)
SELECT '{' || STRING_AGG(REPLACE(TRIM(FORMAT('%T', t), '()'), '", "', '": "'), ', ') || '}' AS return
FROM `project.dataset.table` t
带输出Row return
1 {"key1": "val1", "key2": "val2"}
关于google-bigquery - BigQuery 中的映射(动态键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63490681/