如何以编程方式列出可用的Google BigQuery位置?

时间:2019-04-01 18:37:30

标签: google-bigquery

如何以编程方式列出可用的Google BigQuery位置?我需要一个类似于此页表中的结果:https://cloud.google.com/bigquery/docs/locations

2 个答案:

答案 0 :(得分:2)

正如@shollyman提到的

  

BigQuery API目前不公开等效于列表位置的调用。   因此,您应该考虑在issue tracker上提交功能请求。

平均时间,我想将选项3添加到@Tamir已经提出的两个选项中

这是一个天真的选项,它具有优点和缺点,但是取决于您的特定用例是否有用并易于适应您的应用程序

第1步-加载页面(https://cloud.google.com/bigquery/docs/locations)html
第2步-解析并提取所需信息

很明显,这在您选择的任何客户端中实现超级简单

由于我是BigQuery的忠实拥护者-我使用BigQuery工具-Magnus进行了“概念验证”

我创建的工作流只有两个任务:
API任务-将页面的HTML加载到变量var_payload
中 和
BigQuery任务-从html解析和提取所需信息

“整个”工作流程很简单,就像下面的屏幕截图所示

enter image description here

我在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。从其自述文件:

  

he(对于“ HTML实体”)是用JavaScript编写的健壮的HTML实体编码器/解码器。它支持HTML格式的所有标准化命名字符引用,像浏览器一样处理歧义的“&”号和其他极端情况。

执行工作流程并完成了这两个步骤后-结果在project.dataset.location_extraction中,我们可以查询该表以确保获得期望的结果

enter image description here

注意:显然,解析和提取所需的位置信息已相当简化,并且在更改源页面布局方面肯定可以进行改进以变得更加灵活

答案 1 :(得分:0)

不幸的是,没有提供BigQuery支持的位置列表的API。

我看到两个可能对您有益的选择:

选项1
您可以手动管理列表,并通过API或应用程序支持的任何其他方式将此列表显示给客户端(您需要遵循BigQuery产品更新,才能跟踪此列表中的更新)

选项2
如果您的用例是提供用于存储自己的数据的位置列表,则可以调用dataset.list获取位置列表并在您的应用中显示/使用它


    {
          "kind": "bigquery#dataset",
          "id": "id1",
          "datasetReference": {
            "datasetId": "datasetId",
            "projectId": "projectId"
          },
          "location": "US"
    }