如何在 bigquery 中使用 group_concat 生成 json 字符串?

Posted

技术标签:

【中文标题】如何在 bigquery 中使用 group_concat 生成 json 字符串?【英文标题】:How can I generate json string with group_concat in bigquery? 【发布时间】:2017-12-15 03:53:57 【问题描述】:

我有一张桌子:

user   device   minutes
====   ======   =======
ben    phone    1.9
ben    tablet   2.3
anna   phone    1.6

我想将设备使用打包成一个json字符串,用户喜欢:

user   json
====   =====
ben    "phone":1.9, "tablet":2.3
anna   "phone":1.6, "tablet":2.3

如何在 bigquery 中执行此操作?

【问题讨论】:

【参考方案1】:

以下是 BigQuery 标准 SQL 的版本

#standardSQL
WITH `yourproject.yourdataset.yourtable` AS (
  SELECT 'ben' user, 'phone' device, 1.9 minutes UNION ALL
  SELECT 'ben', 'tablet', 2.3 UNION ALL
  SELECT 'anna', 'phone', 1.6 
)
SELECT 
  user, 
  CONCAT('', STRING_AGG(CONCAT('"',device, '":', CAST(minutes AS STRING))), '') json,
  ROUND(SUM(IF(device='tablet',minutes,0)),2) tablet_minutes
FROM `yourproject.yourdataset.yourtable`
GROUP BY user 

输出如下

user    json                        tablet_minutes   
ben     "phone":1.9,"tablet":2.3  2.3  
anna    "phone":1.6               0.0  

【讨论】:

【参考方案2】:

使用 BigQuery 旧版 SQL

# legacySQL
SELECT
  user,
  json,
  JSON_EXTRACT_SCALAR(json, '$.tablet') AS tablet_minutes
FROM (
  SELECT
    user,
    CONCAT('', GROUP_CONCAT_UNQUOTED(CONCAT('"', device,'":', minutes)), '') AS json,
  FROM 
    (SELECT 'ben' user, 'phone' device, '1.9' minutes),
    (SELECT 'ben' user, 'tablet' device, '2.3' minutes),
    (SELECT 'anna' user, 'phone' device, '1.6' minutes),
  GROUP BY
    user)

使用标准 SQL(感谢 Mikhail)

# standardSQL
WITH `yourproject.yourdataset.yourtable` AS (
  SELECT 'ben' user, 'phone' device, 1.9 minutes UNION ALL
  SELECT 'ben', 'tablet', 2.3 UNION ALL
  SELECT 'anna', 'phone', 1.6 
)
SELECT 
  user, 
  CONCAT('', STRING_AGG(CONCAT('"',device, '":', CAST(minutes AS STRING))), '') json,
  ROUND(SUM(IF(device='tablet',minutes,0)),2) tablet_minutes
FROM `yourproject.yourdataset.yourtable`
GROUP BY user 

两个输出

user    json                        tablet_minutes
====    ====                        ==============   
ben     "phone":1.9,"tablet":2.3  2.3  
anna    "phone":1.6               0.0  

【讨论】:

以上是关于如何在 bigquery 中使用 group_concat 生成 json 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Datalab 的 api 中使用 Bigquery 中的子查询?

如何使用 API 在 BigQuery 中获取临时表的名称

如何连接mysql中单列的所有值

在 Google 表格中使用 BigQuery,如何授予其他用户按“刷新”的权限?

如何在 BigQuery 中使用 UDF 展平 Google Analytics 自定义维度?

如何安全地为 bigquery 节点插入转义用户输入?可以在 bigquery.insert 节点库上使用参数化查询吗?