从没有临时表的BigQuery select语句将数据导出到谷歌云存储

时间:2017-06-29 14:30:01

标签: google-bigquery google-cloud-storage

有没有办法可以在不创建表格的情况下从select语句(BigQuery)将数据导出到谷歌云存储。

我需要每天根据select语句(BigQuery)提取数据,并将文件放在google云端存储中。

我知道我们可以通过以下方式从BigQuery导出。

  1. 命令行 - 在此选项中,我需要创建一个临时表。我看不到没有临时表的任何示例或语法。
  2. bq query --destination_table = mydataset.happyhalloween“SELECT name,count FROM mydataset.babynames WHERE gender ='M'ORDER BY count DESC LIMIT 6” bq extract'bigquery-public-data:samples.shakespeare'gs://example-bucket/shakespeare.csv

    1. WebConsole - 由于需要安排
    2. ,因此该选项已经用完
    3. API - 使用API​​也无法从SQL Query中看到。我看到整个表的例子。
    4. 让我知道有没有办法从Bigquery select语句导出数据到谷歌云存储,而无需创建临时表。

      谢谢,

2 个答案:

答案 0 :(得分:2)

查询结果为always saved to either a temporary or permanent table

当您指定目标表时,这是一个永久表,但如果您不指定,则BigQuery会创建一个短期临时表来存储结果。如果您查看查询历史记录部分,则可以看到这些临时表的名称。

query history

当指定临时表作为源时,我成功地能够将导出作业运行到云存储。

bq extract my-project:_63cfa3...c5d1ef7 gs://my-bucket/my_table.csv

关于使用API​​,如果在插入后获得作业,则可以看到目标表。

https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs/get

在我的示例中,获取与查询作业关联的作业ID的响应显示

{
 "kind": "bigquery#job",
 "id": "my-project:bquijob_ca7e64e_15cf54562fb",
 "jobReference": {
  "projectId": "my-project",
  "jobId": "bquijob_ca7e64e_15cf54562fb"
 },
 "configuration": {
  "query": {
   "query": "SELECT \"ABC\"",
   "destinationTable": {
    "projectId": "my-project",
    "datasetId": "_63cfa399614a54153cc386c27d6c0c6fdb249f9e",
    "tableId": "anondca79e1ad06d03be556f3fc3fdbaaf2b9c5d1ef7"
   },
   "createDisposition": "CREATE_IF_NEEDED",
   "writeDisposition": "WRITE_TRUNCATE",
   "useLegacySql": false
  }
 },
 "status": {
  "state": "DONE"
 },
...
}

答案 1 :(得分:1)

使用 BigQuery SQL 提供的 EXPORT DATA OPTIONS 命令

查询:

EXPORT DATA OPTIONS(uri="gs://example-bucket/shakespeare.csv",format='csv') AS SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6

所以使用“bq”命令行实用程序会是这样的

bq query --format=prettyjson --use_legacy_sql=false 'EXPORT DATA OPTIONS(uri="gs://example-bucket/shakespeare.csv",format='csv') AS SELECT name,count FROM mydataset.babynames WHERE gender = 'M' ORDER BY count DESC LIMIT 6'