将BigQuery中的大量数据加载到python / pandas / dask

问题描述 投票:3回答:4

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

我在BigQuery中有一个大型的大表(假设每天插入2000万行)。我希望在python / pandas / dask中有大约2000万行数据和大约50列进行一些分析。我尝试过使用bqclient,panda-gbq和bq存储API方法,但在python中需要30分钟才能拥有5百万行。有没有其他方法可以这样做?即使是任何谷歌服务可以做类似的工作?

pandas google-cloud-platform google-bigquery bigdata dask
4个回答
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
投票

一些选择:

  • 在将(较小的表)导出到Pandas之前,尝试在BigQuery SQL中进行聚合等。
  • 使用与BigQuery数据集位于同一区域的高内存计算机上的Deep Learning VM,在Google Cloud上运行Jupyter笔记本。这样,网络开销最小化。

1
投票

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

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

实验!


0
投票

您可能希望首先将数据导出到Google云端存储,然后将数据下载到本地计算机并加载它。以下是您需要采取的步骤:

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

除了将数据下载到本地计算机之外,您还可以利用PySpark和SparkSQL进行处理。将数据导出到Google云端存储后,您可以启动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

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.