如何在使用Google Cloud Datalab时将.gz文件加载到BigQuery?

问题描述:

*将它们的日志文件存储为.gz,并且BigQuery能够摄取.gz文件。如何在使用Google Cloud Datalab时将.gz文件加载到BigQuery?

使用Google Cloud Datalab时,如何将这些文件“移动”到BigQuery?

(文件在http://dumps.wikimedia.org/other/pagecounts-raw/

这是我如何加载。广州从网站现在:

import gcp.bigquery as bq 
import gcp.storage as storage 

f = urllib.urlopen(url) 
storage.Bucket('mybucket').item(gcs_url).write_to(f.read(), 'application/x-gzip') 
table = bq.Table('%s.%s' % (dataset_name, table_name)).create(schema=schema, overwrite = True) 
table.load_async(
    'gs://mybucket/%s' % gcs_url, mode='overwrite', csv_delimiter=' ', quote='', max_bad_records=100) 

此下载GZ文件在https://dumps.wikimedia.org/other/pagecounts-raw/2015/2015-01/

观察:

  • 我无法找到一个简单的方法来下载和上传的文件。相反,我把整个东西放在RAM(〜100GB)中。它适用于这种用例,但不适用于较大的文件。

  • 我在将数据加载到表中之前创建表。我无法弄清楚如何在同一时间执行这两个操作(因此BigQuery有一段空表)。

  • 当我使用load_async时,我希望有一个简单的方法来等待所有的作业完成。

  • 任何简单的方法来集成https://cloud.google.com/monitoring/,所以它在工作完成后给我打电话?

(问题跟踪https://github.com/GoogleCloudPlatform/datalab/issues/198

+0

您可以使用gcp.bigquery。wait_any/wait_all等待你的工作完成 –

+0

是的,我们要求你在BQ表之前创建一个Table对象。这是因为Table对象具有像exists(),delete()等方法 - 即它们存在与相应的BQ表是否存在无关。 –

对于来自某些HTTP位置复制大文件,你有一些选择。您可以在笔记本中调用各个bash命令,并在bash单元格中使用wget和gsutil的组合。

%%bash 
mkdir -p /tmp/data 
cd /tmp/data 
wget [src url] 
gsutil cp [local file] [gcs location] 

如果要列举的单个文件,把它写出来,然后调用从bash shell中你甚至可以使用Python来生成一个shell脚本。

或存储传输服务。请参阅转移至开发控制台中的云存储。我相信这是一个API,但我们没有为它构建任何python包装器。至少还没有。


BQ是否支持一次性创建和加载表格。如果是这样,我们应该确保我们的API可以做到这一点。如果是这样,你能提交一个错误吗?


对于等待从load_async返回的作业,请参阅gcp.bigquery.wait_all/any。


工作完成监测/警报 - 好主意。我不完全确定这是Datalab的事情还是底层的工作(例如,在BQ中加载工作)应该这样做。原因是:你可能会杀死你的Datalab内核,甚至是实例,所以你真的希望工作通知,而不是Datalab监视工作的完成。但是,这种整合并没有分歧。