如何以编程方式列出可用的Google BigQuery位置?我需要一个类似于本页表格中的结果:https://cloud.google.com/bigquery/docs/locations。
不幸的是,没有API提供BigQuery支持的位置列表。
我看到两个可能对你有用的选择:
选项1 您可以手动管理列表,并通过API或您的应用程序支持的任何其他方式将此列表公开给您的客户端(您需要遵循BigQuery产品更新以遵循此列表中的更新)
选项2 如果您的用例是提供用于存储您自己的数据的位置列表,您可以调用dataset.list获取位置列表并在您的应用中显示/使用它
{
"kind": "bigquery#dataset",
"id": "id1",
"datasetReference": {
"datasetId": "datasetId",
"projectId": "projectId"
},
"location": "US"
}
正如@shollyman所说
此时,BigQuery API不会公开等效的列表位置调用。因此,您应该考虑在issue tracker上提交功能请求。
同时,我想将选项3添加到@Tamir已经提出的那两个中
这是一个有点天真的选择,它的优点和缺点,但取决于您的具体用例可能是有用的,并很容易适应您的应用程序
第1步 - 加载页面(https://cloud.google.com/bigquery/docs/locations)html 第2步 - 解析并提取所需信息
显然,这在您选择的任何客户端中实现都非常简单
因为我是巨大的BigQuery粉丝 - 我使用BigQuery Tool - Magnus进行了“概念验证”
我只用两个任务创建了工作流程:
API任务 - 将页面的HTML加载到变量var_payload
中
和
BigQuery任务 - 从html中解析和提取想要的信息
“整个”工作流程就像在下面的屏幕截图中看到的一样简单
我在BigQuery Task中使用的查询是
CREATE TEMP FUNCTION decode(x STRING) RETURNS STRING
LANGUAGE js AS """
return he.decode(x);
"""
OPTIONS (library="gs://my_bucket/he.js");
WITH t AS (
SELECT html,
REGEXP_EXTRACT_ALL(
REGEXP_REPLACE(html,
r'\n|<strong>|</strong>|<code>|</code>', ''),
r'<table>(.*?)</table>'
)[OFFSET(0)] x
FROM (SELECT'''<var_payload>''' AS html)
)
SELECT pos,
line[SAFE_OFFSET(0)] Area,
line[SAFE_OFFSET(1)] Region_Name,
decode(line[SAFE_OFFSET(2)]) Region_Description
FROM (
SELECT
pos, REGEXP_EXTRACT_ALL(line, '<td>(.*?)</td>') line
FROM t,
UNNEST(REGEXP_EXTRACT_ALL(x, r'<tr>(.*?)</tr>')) line
WITH OFFSET pos
WHERE pos > 0
)
如你所见,我使用了he library。从其自述文件:
他(对于“HTML实体”)是一个用JavaScript编写的健壮的HTML实体编码器/解码器。它支持所有标准化的命名字符引用,按照HTML,处理模糊的&符号和其他边缘情况,就像浏览器一样......
在执行工作流并完成这两个步骤后 - 结果在project.dataset.location_extraction
中,我们可以查询此表以确保我们已经得到了预期的结果
注意:显然解析和提取所需的位置信息非常简单,并且可以在改变源页面布局方面更加灵活