BigQuery,有没有办法在整个数据库中搜索字符串



我有一个需要在数据库中查找的数据,例如'dsfsdfsads'。但是,有100多个表和视图可供搜索。我发现许多为其他数据库编写的查询可以在数据库中找到特定的字符串。示例发布如下。然而,对于BigQuery,我却不这么认为。我发现了这个问题:是否可以在BigQuery中的所有表中进行全文搜索?,但这篇文章感觉不完整,答案中提供的2个链接没有回答我的问题。

能够查找特定字符串的其他数据库查询示例:

通过在SQLServerManagementStudio2008中搜索所有表来查找字符串

在所有表、所有列中搜索特定值SQL Server

如何在SQL Server数据库中搜索字符串?

我不知道为什么像您提到的帖子中那样使用通配符表搜索数据库不合适。因为我运行了这个示例查询来搜索公共数据集,它运行得很好。

SELECT *
FROM `bigquery-public-data.baseball.*` b
WHERE REGEXP_CONTAINS(TO_JSON_STRING(b), r'Cubs')

我想这是因为其中一个限制是通配符表功能不支持视图
你有很多吗?

在这种情况下,您可以只对表使用通配符,并使用_TABLE_SUFFIX或不太通用的通配符(这取决于视图的名称(过滤掉视图
通常,对于通配符表,使用_TABLE_SUFFIX可以大大减少扫描的字节数,从而降低运行查询的成本。因此,如果您怀疑某些表包含的字符串多于其他表,也可以使用它。

对于视图(或整个数据集(,您可以:
•通过使用带有一些多处理模块(如Python中的多处理(的库之一调用BigQuery API来迭代
•通过从bash脚本调用REST API进行迭代
•使用bash脚本中的bq command进行迭代。

如果你在程序部分遇到了问题,请发布一个新问题并在此处添加链接。

编辑:

这里有两个例子(bash和python(。我试过这两种方法,它们都有效,但任何有助于改进的评论都是受欢迎的

Python:

  1. 安装软件包
pip install --upgrade google-cloud-bigquery
pip install multiprocess
  1. 创建filename.py。更改YOUR_PROJECT_IDYOUR_DATASET

from google.cloud import bigquery
import multiprocessing
def search(dataset_id):
"""
Lists and filters your dataset to keep only views
"""
client = bigquery.Client()

tables = client.list_tables(dataset_id)
views = []
for table in tables:
if table.table_type == 'VIEW':
views.append(table.table_id)
return views
def query(dataset_id, view):
"""
Searches for the string in your views and prints the first one it finds.
You can change or remove 'LIMIT 1' if needed.
"""
client = bigquery.Client()
query_job = client.query(
"""
SELECT *
FROM {}.{} b
WHERE REGEXP_CONTAINS(TO_JSON_STRING(b), r"true")
LIMIT 1
""".format(dataset_id, view)
)
results = query_job.result()  # Waits for job to complete.
for row in results:
print(row)
if __name__ == '__main__':
# TODO: Set dataset_id to the ID of the dataset that contains the tables you are listing.
dataset_id = 'YOUR_PROJECT_ID.YOUR_DATASET'
views = search(dataset_id)
processes = []
for i in views:
p = multiprocessing.Process(target=query, args=(dataset_id, i))
p.start()
processes.append(p)
for process in processes:
process.join()

运行python filename.py


重击:

  1. 安装jq(json解析器(并对其进行测试
sudo apt-get install jq

测试

echo '{ "name":"John", "age":31, "city":"New York" }' | jq .

输出:

{
"name": "John",
"age": 31,
"city": "New York"
}

参考

  1. 创建filename.sh。更改YOUR_PROJECT_IDYOUR_DATASET
#!/bin/bash
FILES="bq ls --format prettyjson YOUR_DATASET"
RESULTS=$(eval $FILES)
DETAILS=$(echo "${RESULTS}" | jq -c '.[]')
for d in $DETAILS
do
ID=$(echo $d | jq -r .tableReference.tableId)
table_type=$(echo $d | jq -r '.type')
if [[ $table_type == "VIEW" ]]
then
bq query --use_legacy_sql=false 
'SELECT *
FROM
`YOUR_PROJECT_ID`.YOUR_DATASET.'$ID' b
WHERE REGEXP_CONTAINS(TO_JSON_STRING(b), r"true")
LIMIT 1'
fi
done

运行bash filename.sh

最新更新