将 BigQuery 结果导出为 Avro 或 JSON

Posted

技术标签:

【中文标题】将 BigQuery 结果导出为 Avro 或 JSON【英文标题】:Export BigQuery Result to Avro or JSON 【发布时间】:2018-06-15 01:36:06 【问题描述】:

如果有办法将 BigQuery 结果保存为 JSON 或 Avro 格式,请告诉我。

我正在使用以下代码在 BigQuery Table 上运行查询。

client = bigquery.Client.from_service_account_json('/Users/gaurang.shah/Downloads/fb3735b731b9.json')

job_config = bigquery.QueryJobConfig()
job_config.priority = bigquery.QueryPriority.BATCH
sql = """
   select * 
    FROM `bigquery-public-data.samples.shakespeare`
    limit 1;
"""
location = 'US'
query_job = client.query(sql, location=location, job_config=job_config)
query_job = client.get_job(query_job.job_id, location=location)  
print(query_job.result())

我正在尝试在不使用 GCS 的情况下导出 BigQuery 表。这是我认为可以实现这一目标的一种方式。

我认为另一种方法是使用BQ command line 工具。但是不确定它是否对我可以触发多少个查询以及我可以检索多少数据有任何限制。

【问题讨论】:

【参考方案1】:

您需要先运行查询,将结果写入表中,然后挂钩到 BigQuery export/extract API,其中可以将结果/表以您想要的格式导出到 GCS。例如,这里是 CSV:

# from google.cloud import bigquery
# client = bigquery.Client()
# bucket_name = 'my-bucket'
project = 'bigquery-public-data'
dataset_id = 'samples'
table_id = 'shakespeare'

destination_uri = 'gs:///'.format(bucket_name, 'shakespeare.csv')
dataset_ref = client.dataset(dataset_id, project=project)
table_ref = dataset_ref.table(table_id)

extract_job = client.extract_table(
    table_ref,
    destination_uri,
    # Location must match that of the source table.
    location='US')  # API request
extract_job.result()  # Waits for job to complete.

print('Exported :. to '.format(
    project, dataset_id, table_id, destination_uri))

查看更多here。

【讨论】:

由于某些法律原因,我们不想使用GCS,这就是为什么我尝试在表上运行select 查询然后尝试将其保存在local 机器上. 为什么不能使用 GCS?您不能将查询结果写入除表之外的任何其他位置。但是,您可以使用 Tabledata API (cloud.google.com/bigquery/docs/reference/rest/v2/tabledata/list) 并将其通过电线吸到您的机器上,但我不建议这样做,因为它不会扩展。 我知道扩展和性能将是一个大问题,但是我们被告知我们不能使用它。 bq command line 转换为 Json 怎么样。但是我没有找到任何关于它可以获取的行/数据的限制的文档。 在这里使用 bq 命令并不能真正帮助您 - 我相信它使用官方 API - 所以它只会使用 tabledata.list - 所以它不会扩展。我认为您可能应该将访问 GCS 的问题提交给告诉您不要使用它的人。它的安全性不亚于 bigquery 本身 @GrahamPolley 将查询结果转换为 json

以上是关于将 BigQuery 结果导出为 Avro 或 JSON的主要内容,如果未能解决你的问题,请参考以下文章

使用压缩的 AVRO 从 BigQuery 导出表

从 Avro 将 unix 时间戳(以秒为单位)导入 Bigquery 中的正确时间戳

在 BigQuery 中加载 avro 文件 - 默认值的类型为意外类型。预期为 null,但找到字符串:“null”

BigQuery 下载或导出为 JSON 不考虑类型

使用带有自动模式检索的 LoadJobs 时如何处理 Avro 到 BigQuery 的类型转换

将 unix 时间戳转换为 avro 并将其存储在 BigQuery 中