使用 Big Query,我如何在一条记录中查询多个对象?

Posted

技术标签:

【中文标题】使用 Big Query,我如何在一条记录中查询多个对象?【英文标题】:Using Big Query, how can I query within a record for multiple objects? 【发布时间】:2018-06-20 19:16:38 【问题描述】:

下面是我正在使用的结构。它是来自 firebase 的 Google Analytic 事件。

我需要 AND 穿过 params 数组,并只返回一个带有“eventData”键的参数值。同时我需要通过在同一个 params 数组中找到的另外两个对象(具有键值 'peripheral' 和 'eventType')来限制查询。

我正在使用旧版 SQL,但愿意使用其他东西。我看着并玩了 FLATTEN,但这似乎并没有给我最终想要的东西。 查询示例可能更有意义。

    SELECT event_dim.params.value.int_value -- this needs to come from the eventData object
    FROM 
   [table]
    where event_dim.name = 'EPILOG_BAT'
    AND event_dim.timestamp_micros > 1529423373498009
    -- AND event_dim.params contains (key='peripheral', string_value = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE')
    -- AND event_dim.params contains (key='eventType', string_value = 'V')
    order by event_dim.timestamp_micros ,
    event_dim.params.key

我希望得到的行是 4105

数据:

 "event_dim": [
  
    "date": "20180620",
    "name": "EPILOG_BAT",
    "params": [

      
        "key": "eventData",
        "value": 
          "string_value": null,
          "int_value": "4105",
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "peripheral",
        "value": 
          "string_value": "CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "eventTime",
        "value": 
          "string_value": null,
          "int_value": "1529499380000",
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "eventType",
        "value": 
          "string_value": "V",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      ,
      
        "key": "firmwareVersion",
        "value": 
          "string_value": "0.8.6\u0000\u0000\u0000\u0000\u0000\u0000\u0000",
          "int_value": null,
          "float_value": null,
          "double_value": null
        
      
    ],
    "timestamp_micros": "1529478561132285",
    "previous_timestamp_micros": "1529478560856003",
    "value_in_usd": null
  ,

【问题讨论】:

您的 JSON 文件是否正确?我试图导入它,试图帮助你,但我不能。就像它一样,它不是一个有效的 JSON,即使在尝试“修复它”之后,Big Query 也无法识别它。 @Mangu 可能不是,记录太大,无法包含。这是记录的要点。我从 bigquery ui 将其复制为 json。 gist.github.com/anwarhamr/c08a66db6e91535376d4598180156d60 为什么在查询示例中的 2 个 AND 条件之前使用 2 个破折号?您确定您使用的是旧版 SQL 吗?如果您使用的是标准 SQL,则 2 个破折号是 cmets,您没有对其进行过滤。你能澄清一下吗? @J.LValtueña 我很清楚注释掉代码,是的,这对于示例是有意的;包含时查询失败。是的,我确定它是 Legacy,因为它与选项中设置的 Legacy 复选框一起工作。如果您有解决方案,它可以是旧版 SQL 或标准 SQL 【参考方案1】:

可能是这样的(请原谅我的格式):

#standardSql
SELECT
(SELECT params.value.int_value FROM event.params WHERE params.key = 
'eventData') AS id
FROM `data_source`, 
UNNEST(event_dim) AS event,
UNNEST(event.params) AS params
WHERE event.name = 'EPILOG_BAT'
AND event_dim.timestamp_micros > 1529423373498009
AND (SELECT params.value.string_value FROM event.params WHERE params.key = 
'peripheral') = 'CA5D6D4C-9B4C-9BB1-03CF-5A8BCD7651FE'
AND (SELECT params.value.string_value FROM event.params WHERE params.key = 
'eventType') = 'V'

【讨论】:

@Robel Robel Lingstuyl 这个答案对你有用吗?

以上是关于使用 Big Query,我如何在一条记录中查询多个对象?的主要内容,如果未能解决你的问题,请参考以下文章

Google Big Query Error: CSV table 遇到太多错误,放弃。行:1 错误:1

Big Query 未成功执行

Big Query:如何提取数据集的每个表创建时间?

如何在 Google Big Query 中正确使用 GROUP BY 命令?

如何在 Big Query 中查询 Firebase Analytics 事件表的多个分区

Big Query 过滤自定义查询创建表的空行