【问题标题】:How to query all entries with a value in a nested bigquery table如何在嵌套的 bigquery 表中查询具有值的所有条目
【发布时间】:2018-01-09 01:10:46
【问题描述】:

我使用现有的 BigTable 表生成了一个 BigQuery 表,结果是一个多嵌套的数据集,我很难从中查询。这是该 BigQuery 表中的条目的格式,只需执行简单的select * from my_table limit 1

[
  {
    "rowkey": "XA_1234_0",
    "info": {
      "column": [],
      "somename": {
        "cell": [
          {
            "timestamp": "1514357827.321",
            "value": "1234"
          }
        ]
      },
      ...
    }
  },
  ...
]

我需要的是能够从my_table 获取所有条目,例如somenamevalue 是X。将有多个行键,其中somenamevalue 将是 X,我需要每个行键条目中的所有数据。

如果我可以查询其中 rowkey 包含 X,那么要获得“XA_1234_0”、“XA_1234_1”……“XA”和“0”可以改变,但中间数字相同。我试过where rowkey like "$_1234_$",但查询持续了超过一分钟,并且由于某种原因太长了。

我使用的是标准 SQL。

编辑:这是我尝试过的一个查询示例,但它不起作用(错误:Cannot access field value on a value with type ARRAY<STRUCT<timestamp TIMESTAMP, value STRING>>),但最好地描述了我想要实现的目标:

SELECT * FROM `my_dataset.mytable` where info.field_name.cell.value=12345

我想获取field_name 中的value 等于某个值的所有记录。

【问题讨论】:

    标签: sql google-bigquery


    【解决方案1】:

    来自sample Firebase Analytics dataset

    #standardSQL
    SELECT *
    FROM `firebase-analytics-sample-data.android_dataset.app_events_20160607`
    WHERE EXISTS(
      SELECT * FROM UNNEST(user_dim.user_properties)
      WHERE key='powers' AND value.value.string_value='20'
    )
    LIMIT 1000
    

    【讨论】:

      【解决方案2】:

      以下是 BigQuery 标准 SQL

      #standardSQL
      SELECT t.*
      FROM `my_dataset.mytable` t, 
        UNNEST(info.somename.cell) c
      WHERE c.value = '1234'  
      

      以上假设特定的value 可以在每条记录中出现一次 - 希望这对你来说是真的

      如果不是这种情况-下面应该是这样的

      #standardSQL
      SELECT *
      FROM `yourproject.yourdadtaset.yourtable`
      WHERE EXISTS(
        SELECT * 
        FROM UNNEST(info.somename.cell)
        WHERE value = '1234'
      )   
      

      我刚刚意识到这与 Felipe 的版本几乎相同 - 但只是使用您的表/架构

      【讨论】:

      • 所以我尝试使用这两个查询,虽然它们运行没有错误,但查询需要很长时间。我没有让它完成,但它超过了 2 分钟,这比我们需要的要长得多,任何超过几秒的时间都太长了。我认为这可能是数据结构固有的,并且必须取消嵌套每条记录的成本很高。
      • 这很可能是因为模式和取消嵌套的需要。您可能会尝试重新访问架构并将其展平以进行查询。还 - 你需要SELECT * 或者你可以在输出中获得几个字段 - 通常它也有助于加快将结果加载到客户端
      猜你喜欢
      • 1970-01-01
      • 2021-08-26
      • 2019-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      相关资源
      最近更新 更多