3
我需要一個查詢找到BigQuery中的表格列的名稱,如下面的查詢在SQL:的BigQuery查詢查找表的列名
SELECT column_name,data_type,data_length,data_precision,nullable FROM all_tab_cols where table_name ='EMP';
我需要一個查詢找到BigQuery中的表格列的名稱,如下面的查詢在SQL:的BigQuery查詢查找表的列名
SELECT column_name,data_type,data_length,data_precision,nullable FROM all_tab_cols where table_name ='EMP';
它目前無法檢索表的元數據(即列名和類型),但這不是第一次被請求。
是否有一個原因,你需要做這個查詢?表元數據可通過tables API獲取。
實際上,使用SQL可以這樣做。爲此,您需要查詢日誌記錄表以獲取正在創建的特定表的最後一個日誌。
例如,假設正裝表/每天創建:
CREATE TEMP FUNCTION jsonSchemaStringToArray(jsonSchema String)
RETURNS ARRAY<STRING> AS ((
SELECT
SPLIT(
REGEXP_REPLACE(REPLACE(LTRIM(jsonSchema,'{ '),'"fields": [',''), r'{[^{]+"name": "([^\"]+)"[^}]+}[, ]*', '\\1,')
,',')
));
WITH valid_schema_columns AS (
WITH array_output aS (SELECT
jsonSchemaStringToArray(jsonSchema) AS column_names
FROM (
SELECT
protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.schemaJson AS jsonSchema
, ROW_NUMBER() OVER (ORDER BY metadata.timestamp DESC) AS record_count
FROM `realself-main.bigquery_logging.cloudaudit_googleapis_com_data_access_20170101`
WHERE
protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.tableId = '<table_name>'
AND
protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.destinationTable.datasetId = '<schema_name>'
AND
protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.load.createDisposition = 'CREATE_IF_NEEDED'
) AS t
WHERE
t.record_count = 1 -- grab the latest entry
)
-- this is actually what UNNESTS the array into standard rows
SELECT
valid_column_name
FROM array_output
LEFT JOIN UNNEST(column_names) AS valid_column_name
)
感謝克雷格,表API是足以讓我拿到表的元數據。 – user1487985
我個人希望這可以作爲一個查詢來完成的原因是因爲這就是我的項目之前一直在做的事情,在移動所有內容的過程中必須學習和轉換的功能更少。 –