簡體   English   中英

如何使用python API在bigquery中創建新視圖?

[英]How can I create a new view in bigquery using the python API?

我有一些代碼可以自動生成一堆不同的SQL查詢,我想將這些查詢插入到bigquery中以生成視圖,但我遇到的一個問題是這些視圖需要每晚動態生成,因為它們的性質不斷變化的數據。 所以我希望能夠使用google bigquery api for python來創建視圖。 我理解如何使用'bq'命令行工具來完成它,但我希望能夠直接在代碼中構建它,而不是使用shell來運行bq。 我玩過提供的代碼

https://cloud.google.com/bigquery/bigquery-api-quickstart

我不明白如何使用這段代碼創建一個視圖,而不是只返回SELECT語句的結果。 我可以在這里看到有關執行表插入的文檔

https://cloud.google.com/bigquery/docs/reference/v2/tables/insert

但這指的是使用REST API生成新表,而不是上面提供的示例。

這是不可能的嗎? 我應該讓步並使用bq嗎?

謝謝

***針對費利佩的評論提出了一些其他問題。

表資源文檔表明存在許多必填字段,其中一些字段即使我不完全理解它們要求的內容也是有意義的,其他字段則沒有。 例如,externalDataConfiguration.schema。 這是指我正在連接的數據庫的模式(我認為是這樣),還是用於存儲數據的模式?

那么externalDataConfiguration.sourceFormat呢? 由於我正在嘗試查看預先存在的數據庫,因此我不確定我是否了解源格式的相關性。 它是我正在制作視圖的數據庫的源格式嗎? 我該如何識別?

和externalDataConfiguration.sourceUris [],我沒有將新數據導入數據庫,所以我不明白這個(或前一個元素)是如何需要的。

架構怎么樣?

tableReference.datasetId,tableReference.projectId和tableReference.tableId是不言自明的。

類型將是view,view.query將是用於生成視圖的實際sql查詢。 所以我明白為什么那些是制作視圖所必需的,但我不理解其他部分。

你能幫我理解這些細節嗎?

謝謝,布拉德

使用https://cloud.google.com/bigquery/docs/reference/rest/v2/tables/insert

假設您添加授權,請提交以下內容

{
  "view": {
    "query": "select column1, count(1) `project.dataset.someTable` group by 1",
    "useLegacySql": false
  },
  "tableReference": {
    "tableId": "viewName",
    "projectId": "projectName",
    "datasetId": "datasetName"
  }
}

或者在Python中使用,假設您有一個服務密鑰設置和環境變量GOOGLE_APPLICATION_CREDENTIALS = / path / to / my / key。 需要注意的是,據我所知,這只能使用遺留sql創建視圖,並且只能使用遺留sql查詢擴展,盡管直接API方法允許使用遺留或標准。

from google.cloud import bigquery

def create_view(dataset_name, view_name, project, viewSQL):

    bigquery_client = bigquery.Client(project=project)

    dataset = bigquery_client.dataset(dataset_name)
    table = dataset.table(view_name)

    table.view_query = viewSQL

    try:
        table.create()
        return True
    except Exception as err:
        print(err)
        return False

Web UI或bq工具所做的一切都是通過BigQuery API完成的,所以不要放棄:)。

創建視圖類似於創建表,只需確保在調用tables.insert()時具有包含視圖屬性的表資源。

注意:這改變了0.28.0的庫 - 請參閱以下內容以獲取更多詳細信息: Google BigQuery:通過Python創建視圖google-cloud-bigquery版本0.27.0 vs. 0.28.0

我的示例功能

# create a view via python
def create_view(dataset_name, view_name, sqlQuery, project=None):
    try:

        bigquery_client = bigquery.Client(project=project)
        dataset_ref = bigquery_client.dataset(dataset_name)
        table_ref = dataset_ref.table(view_name)
        table = Table(table_ref)
        table.view_query = sqlQuery
        table.view_use_legacy_sql = False
        bigquery_client.create_table(table)

        return True

    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

BigQuery的。 版本 - > '1.10.0'

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view = dataset_ref.table(view_name)
        # view.table_type = 'VIEW'
        view.view_query = view_query
        view.view_query_legacy_sql  = False
        client.create_table(view)
        pass
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

創建一個表而不是一個視圖!!!!

這是創建視圖的正確代碼:

def create_view(client, dataset_name, view_name, view_query):
    try:
        dataset_ref = client.dataset(dataset_name)
        view_ref = dataset_ref.table(view_name)
        table = bigquery.Table(view_ref)
        table.view_query = view_query
        table.view_use_legacy_sql = False
        client.create_table(table)
    except Exception as e:
        errorStr = 'ERROR (create_view): ' + str(e)
        print(errorStr)
        raise

有必要的

table = bigquery.Table(view_ref)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM