如何知道我的表中都有哪些属于 bigQuery 的长期存储?

Posted

技术标签:

【中文标题】如何知道我的表中都有哪些属于 bigQuery 的长期存储?【英文标题】:How to know which among my tables falls under long term storage in bigQuery?如何知道我的表中有哪些属于 bigQuery 的长期存储? 【发布时间】:2019-10-31 13:49:03 【问题描述】:

我目前在一个项目中有多个数据集,我想知道是否有办法一次性知道过去 90 天内未更新的表是什么,这意味着它属于长期存储桶大查询。有一些 sql 语法吗?

谢谢

【问题讨论】:

这能回答你的问题吗? Get the Last Modified date for all BigQuery tables in a BigQuery Project 谢谢,我实际上是在寻找更详细的结果,因为我有例如 50 个数据集,每个数据集有 20 个表,我必须逐个检查每个数据集。如果有任何方法一次检查所有数据集中的所有表,以了解它们的大小以及上次修改的时间 【参考方案1】:

不是 SQL,但可能的解决方案是使用 bqtool。描述表将返回长期存储字节数 (numLongTermBytes):

$ bq show --format=prettyjson dataset.table
...
  "kind": "bigquery#table", 
  "lastModifiedTime": "1534845362446", 
  "location": "US", 
  "numBytes": "56", 
  "numLongTermBytes": "56", 
  "numRows": "3", 
... 

因此,您可以将其扩展为列出每个数据集中的所有表,并从每个表中获取所需的信息。基于this 我做了一个简单的例子:

#!/bin/bash

project=PROJECT_ID
dataset=DATASET_NAME
max_results=100

# get list of tables
tables=$(bq ls --max_results $max_results "$project:$dataset" | awk 'print $1' | tail -n +3)

# get LTS bytes for each table
for table in $tables
do
    printf '%-35s %-50s\n' "$table" "$(bq show --format prettyjson $project:$dataset.$table | grep numLongTermBytes)"
done

你会得到类似的输出:

Dfp                                   "numLongTermBytes": "0",                        
SO_55506947                           "numLongTermBytes": "144",                      
SO_55506947_bis                       "numLongTermBytes": "144",                      
a                                     "numLongTermBytes": "7",                        
a1                                    "numLongTermBytes": "399",                      
aaa                                   "numLongTermBytes": "8",                        
adaptive                              "numLongTermBytes": "1085",                     
adaptive_view                         "numLongTermBytes": "0",                        
audience_segment_map_exp_test         "numLongTermBytes": "300",                      
b                                     "numLongTermBytes": "7", 
... 

【讨论】:

使用 datasets=$( bq ls | tail -n +3) 和 for/do 循环遍历所有数据集【参考方案2】:

我有同样的问题,但在给定项目的所有数据集中都需要它。我接受了@Guillem Xercavins 的回答并将其包装在另一个 for 循环中,并使项目成为命令行输入。

#!/bin/bash

project=$1
max_results=1000


# Get the datasets

datasets=$(bq ls --datasets=true --project_id=$project | awk 'print $1' | tail -n +3)


for dataset in $datasets
do
   # get list of tables
   # The tail -n +3 strips off the header lines
   tables=$(bq ls --max_results $max_results "$project:$dataset" | awk 'print $1' | tail -n +3)

   # get LTS bytes for each table
   for table in $tables
   do
       printf '%-35s %-50s\n' "$table" "$(bq show --format prettyjson $project:$dataset.$table | grep numLongTermBytes)"
   done
done

【讨论】:

以上是关于如何知道我的表中都有哪些属于 bigQuery 的长期存储?的主要内容,如果未能解决你的问题,请参考以下文章

如何查看SQL表中都存在哪些约束?

如何从具有字典列表的表中查询,仅针对某些键 (BigQuery) SQL

hive中如何查看A库中都有哪些表?这表里都有哪些列?

如何查看mysql数据库中都有哪些表?

如何以编程方式在 BigQuery 表中添加字段描述

如何知道堆栈中都有哪些视图(或视图控制器)?