【问题标题】:Failed to import large data as dataframe, from Google BigQuery to Google Cloud DataLab无法将大数据作为数据框从 Google BigQuery 导入到 Google Cloud DataLab
【发布时间】:2017-12-05 16:36:14
【问题描述】:

我尝试了两种方法将 Google BigQuery 中的一个大表(大约 50,000,000 行,18GB)导入到 Google Datalab 的数据框中,以便使用 Tensorflow 进行机器学习。

首先我使用(所有需要的模块都被导入):

data = bq.Query('SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME`').execute().result().to_dataframe()

然后它将保持Running... 直到永远。 即使我做了LIMIT 1000000,它也不会改变。

我第二次使用:

data = pd.read_gbq(query='SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME` LIMIT 1000000', dialect ='standard', project_id='PROJECT_ID')

一开始运行良好,但是当它达到大约 450,000 行时(使用百分比和总行数计算),它就卡在了:

Got page: 32; 45.0% done. Elapsed 293.1 s.

我找不到如何在 read_gbq() 中启用 allowLargeResults。 正如其document 所说,我尝试:

data = pd.read_gbq(query='SELECT {ABOUT_30_COLUMNS...} FROM `TABLE_NAME` LIMIT 1000000', dialect ='standard', project_id='PROJECT_ID', configuration = {'query': {'allowLargeResult': True}})

然后我得到:

read_gbq() got an unexpected keyword argument 'configuration'

这就是我什至未能将 1,000,000 行导入 Google Cloud Datalab 的原因。 我实际上想导入 50 倍的数据大小。

有什么想法吗?

谢谢

【问题讨论】:

    标签: pandas google-bigquery google-cloud-datalab


    【解决方案1】:

    在将大型数据集加载到 Google Cloud Datalab 之前:确保考虑替代方案,例如本答案的 cmets 中提到的替代方案。使用采样数据进行初步分析,确定问题的正确模型,然后使用流水线方法(例如Google Cloud Dataflow)来处理大型数据集。

    在将数据从 BigQuery 下载到 Datalab here 时,有一个关于 Datalab 性能改进的有趣讨论。基于这些性能测试,性能改进被合并到Pull Request #339 中的 Google Cloud Datalab。 Datalab 的release notes 中似乎没有提到此改进,但我相信这些修复程序已包含在 Datalab 1.1.20170406 中。请检查 Google Cloud Datalab 的版本,以确保您运行的是至少 1.1.20170406 版。要查看版本,请先点击 Cloud Datalab 导航栏右上角的用户图标,然后点击About Datalab

    关于pandas.read_gbq() 命令似乎卡住了。我想提出几点建议:

    1. pandas-gbq 存储库here 中打开一个新问题。
    2. 例如,尝试以 csv 格式将数据从 BigQuery 提取到 Google Cloud Storage,然后您可以使用 pd.read_csv 将其加载到数据帧中。这里有两种方法可以做到这一点:

    使用 Google BigQuery/Cloud Storage CLI 工具: 使用 bq command line toolgsutil command line tool,将数据从 BigQuery 提取到 Google Cloud Storage,然后将对象下载到 Google Cloud Datalab。要做到这一点,请输入bq extract <source_table> <destination_uris>,然后输入gsutil cp [LOCAL_OBJECT_LOCATION] gs://[DESTINATION_BUCKET_NAME]/

    使用 Google Cloud Datalab

    import google.datalab.bigquery as bq
    import google.datalab.storage as storage
    bq.Query(<your query>).execute(output_options=bq.QueryOutput.file(path='gs://<your_bucket>/<object name>', use_cache=False)).result()
    result = storage.Bucket(<your_bucket>).object(<object name>).download()
    

    关于错误read_gbq() got an unexpected keyword argument 'configuration',在版本0.20.0 中添加了传递任意关键字参数(configuration) 的功能。我相信这个错误是因为pandas 不是最新的。您可以通过运行检查安装的熊猫版本

    import pandas
    pandas.__version__
    

    要升级到版本 0.20.0,请运行 pip install --upgrade pandas pandas-gbq。这还将安装pandas-gbq,这是pandas 的可选依赖项。

    或者,您可以尝试迭代 Google Cloud Datalab 中的表。这可行,但可能会更慢。此处的另一个 StackOverflow 答案中提到了这种方法:https://stackoverflow.com/a/43382995/5990514

    我希望这会有所帮助!如果您有任何问题,请告诉我,以便我改进此答案。

    安东尼奥·帕泰尼乌

    投稿人Cloud Datalab

    项目维护者pandas-gbq

    【讨论】:

    • 我想知道使用 datalab 更像是一个笔记本来对采样数据进行快速分析和深入探索,而不是一次带来 500 亿行数据是否更好。处理如此大量的数据需要我想象的一些集群结构,不确定datalab是否能够处理或扩大处理它(比如首先处理采样数据,找到问题的正确模型,然后使用一些集群来处理处理整个数据)。
    • @我同意。这绝对是用户应该考虑的事情。请随时将您的评论作为单独的答案提交。另外,如果分析需要所有行,则潜在用户可以消除不必要的列以减小整体数据集大小。
    • 我宁愿让你用这些信息更新你的答案:),它已经足够好了,也许它只需要警告 OP 关于处理采样数据的方法,然后将模型和结论带到一个集群中进一步处理。
    • 已更新。谢谢@Will!
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 2017-11-13
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    相关资源
    最近更新 更多