如何在嵌套的bigquery表

时间:2018-01-09 01:10:46

标签: sql google-bigquery

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

的条目格式
[
  {
    "rowkey": "XA_1234_0",
    "info": {
      "column": [],
      "somename": {
        "cell": [
          {
            "timestamp": "1514357827.321",
            "value": "1234"
          }
        ]
      },
      ...
    }
  },
  ...
]

我需要的是能够从my_table获取value somename为{X}的所有条目。将有多个rowkeys,value的{​​{1}}将为X,我需要来自每个rowkey条目的所有数据。

OR

如果我有一个查询,其中rowkey包含X,那么得到“XA_1234_0”,“XA_1234_1”......“XA”和“0”可以改变,但中间的数字是相同的。我已经尝试过somename,但查询会持续一分钟以上,并且由于某种原因太长了。

我正在使用标准SQL。

编辑:这是我尝试过的一个不起作用的查询示例(错误:where rowkey like "$_1234_$"),但最好描述了我想要实现的目标:

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 value等于某个值的所有记录。

2 个答案:

答案 0 :(得分:2)

来自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

enter image description here

答案 1 :(得分:1)

以下是BigQuery Standard 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的版本差不多 - 但只是使用你的表/架构