【问题标题】:Query specific tables in Bigtable from BigQuery从 BigQuery 查询 Bigtable 中的特定表
【发布时间】:2021-12-03 03:05:12
【问题描述】:

我在 Google BigTable 中有一些数据,我在这些数据上构建了一个 BigQuery 外部表(根据 Querying Cloud Bigtable data,这样我就可以使用常规 SQL(我非常熟悉)查询 Bigtable 表。

当我发出select * 时,我得到这个:

现在我想知道在这个嵌套数据中查询特定值的语法。例如,要获取accountIds 的列表,我可以这样做:

SELECT  ARRAY(SELECT timestamp FROM UNNEST(attributes.column[OFFSET(0)].cell)) AS timestamp,
        ARRAY(SELECT SAFE_CONVERT_BYTES_TO_STRING(value) FROM UNNEST(attributes.column[OFFSET(0)].cell)) AS values
FROM `table` 
where SAFE_CONVERT_BYTES_TO_STRING(rowkey) = 'XXXX'

返回:

这是,嗯,有点方便。

同样,我可以通过像这样更改 OFFSET 来获得car#le11mcr#policyStartDate

SELECT  ARRAY(SELECT timestamp FROM UNNEST(attributes.column[OFFSET(6)].cell)) AS timestamp,
        ARRAY(SELECT SAFE_CONVERT_BYTES_TO_STRING(value) FROM UNNEST(attributes.column[OFFSET(6)].cell)) AS values
FROM `table` 
where SAFE_CONVERT_BYTES_TO_STRING(rowkey) = 'XXXX'

但是,这两个查询都要求我知道要传递给 OFFSET() 的值,并且该值似乎取决于 Bigtable 列的字母顺序,因此如果另一个名称以(例如)“b”开头的列出现在将来我的查询将不再返回相同的内容。

我需要一种比使用OFFSET() 更好的查询表的方法。基本上我想能够说:

为名称为accountId的单元格选择单元格值和时间戳记值

为名称为car#le11mcr#policyStartDate的单元格选择单元格值和时间戳记值

有没有办法做到这一点?我对执行此操作的 BigQuery 语法不太熟悉。

【问题讨论】:

    标签: google-bigquery google-cloud-bigtable


    【解决方案1】:

    好的,我已经取得了一点进展。

    这个:

    SELECT  
        (
        select array(select timestamp from unnest(cell)) 
        from unnest(attributes.column) where name in ('accountId')
        ) accountIdTimestamp,
        (
        select array(select value from unnest(cell)) 
        from unnest(attributes.column) where name in ('accountId')
        ) accountIdValue
    FROM `table` 
    where SAFE_CONVERT_BYTES_TO_STRING(rowkey) = 'XXXX'
    limit 3
    

    返回:

    这更好,但请注意它没有返回前两行的任何内容。那是因为这两行没有名为 accountId 的单元格,我可以通过引入 WHERE 子句来解决这个问题:

    SELECT  
        (
        select array(select timestamp from unnest(cell)) 
        from unnest(attributes.column) where name in ('accountId')
        ) accountIdTimestamp,
        (
        select array(select value from unnest(cell)) 
        from unnest(attributes.column) where name in ('accountId')
        ) accountIdValue
    FROM `table` 
    where ARRAY_LENGTH(ARRAY(
        select name from unnest(attributes.column) where name in ('accountId')
        )) > 0
    limit 3
    

    返回:

    这就是我想要的,我想,但我想有一种更好的方法来实现这一点,不需要太多的打字和复杂的逻辑(特别是 WHERE 子句感觉就像一个非常复杂的说法只有在有accountId时才给我行。

    任何使这更有效或更易读的建议将不胜感激。

    我要解决的下一个挑战是为max(accountIdTimestamp) 返回accountIdValue

    【讨论】:

      猜你喜欢
      • 2018-12-11
      • 2020-05-26
      • 2021-03-26
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      • 2017-04-17
      相关资源
      最近更新 更多