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
我个人希望这可以作为一个查询来完成的原因是因为这就是我的项目之前一直在做的事情,在移动所有内容的过程中必须学习和转换的功能更少。 –