从BigQuery加载大量数据到python / pandas / dask

时间:2019-03-06 23:05:15

标签: pandas google-cloud-platform google-bigquery bigdata dask

我阅读了其他类似的主题,并搜索了Google,以找到更好的方法,但找不到任何可行的解决方案。

我在BigQuery中有一个大表(假设每天要插入2000万行)。我想在python / pandas / dask中有大约2000万行数据和大约50列,以进行一些分析。我尝试使用bqclient,panda-gbq和bq存储API方法,但是在python中有500万行需要30分钟。还有其他方法吗?甚至任何可用的Google服务都可以完成类似的工作?

4 个答案:

答案 0 :(得分:2)

您可以始终将内容导出到云存储中,而不用查询->在本地下载->加载到dask / pandas数据框中:

  1. 导出+下载:

    bq --location=US extract --destination_format=CSV --print_header=false 'dataset.tablename' gs://mystoragebucket/data-*.csv &&  gsutil -m cp gs://mystoragebucket/data-*.csv /my/local/dir/ 
    
  2. 加载到Dask:

    >>> import dask.dataframe as dd
    >>> df = dd.read_csv("/my/local/dir/*.csv")
    

希望有帮助。

答案 1 :(得分:1)

一些选项:

  • 尝试在BigQuery SQL中进行汇总等操作,然后再导出(较小的表)到 熊猫。
  • 在与BigQuery相同区域的高内存计算机上使用深度学习VM在Google Cloud上运行Jupyter笔记本 数据集。这样,可以将网络开销降到最低。

答案 2 :(得分:1)

首先,您应该分析代码以找出花费时间。它只是在等待大查询来处理您的查询吗?它是数据下载>您的带宽是多少,您使用什么比例?是将这些数据解析到内存中吗?

由于您可以使SQLAlchemy支持大查询(https://github.com/mxmzdlv/pybigquery),因此可以尝试使用AppModule将查询拆分为多个分区并并行加载/处理它们。如果大查询将带宽限制在单个连接或单个计算机上,则可以通过在分布式集群上运行它来提高吞吐量。

实验!

答案 3 :(得分:0)

可能您想先将数据导出到Google Cloud Storage,然后再将数据下载到本地计算机并加载。 这是您需要采取的步骤:

  • 创建一个中间表,其中将包含您想要的数据 出口。您可以选择并存储到中间表。
  • 将中间表导出为Google Cloud Storage,JSON / Avro / Parquet格式。
  • 下载导出的数据并加载到python应用。

除了将数据下载到本地计算机外,您还可以使用PySpark和SparkSQL进行处理。将数据导出到Google Cloud Storage后,您可以启动Cloud Dataproc集群并将数据从Google Cloud Storage加载到Spark,并在那里进行分析。

您可以在此处阅读示例

https://cloud.google.com/dataproc/docs/tutorials/bigquery-connector-spark-example

您还可以在Dataproc集群中启动Jupyter Notebook

https://cloud.google.com/dataproc/docs/tutorials/jupyter-notebook

希望这会有所帮助。