【问题标题】:How to query GCP tables fast如何快速查询 GCP 表
【发布时间】:2021-01-29 23:15:56
【问题描述】:

我需要构建一个从谷歌云平台公共表返回数据的小 api。 目前我正在尝试使用 python 获取数据,但查询表需要永远,因为它有数百万行。有没有办法查询表,同时排除 null 等并在 2 分钟内向客户端返回响应?如果是的话,我应该以某种方式异步吗? 我当前的代码是:

import google.auth
from google.cloud import bigquery
from google.cloud import bigquery_storage
import pandas
import pandas_gbq
from google.oauth2 import service_account

credentials = service_account.Credentials.from_service_account_file(
    **you need service account credentials**
)
sql = SELECT passenger_count, trip_distance, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude
FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2016`
WHERE pickup_longitude IS NOT NULL AND pickup_latitude IS NOT NULL 
AND dropoff_longitude IS NOT NULL AND dropoff_latitude IS NOT NULL
AND passenger_count < 7 AND passenger_count > 0
AND pickup_longitude != 0.0 AND pickup_latitude  != 0.0 
AND dropoff_longitude  != 0.0 AND dropoff_latitude  != 0.0

我使用熊猫:

df = pandas_gbq.read_gbq(sql,project_id='disco-parsec-303220',credentials=credentials)

【问题讨论】:

  • 您正在强制 BigQuery 读取每一行。尝试仅使用来自 passenger_count &lt; 7 AND passenger_count &gt; 0 的结果创建一个临时表,然后使用其余查询要求查询该临时表。此外,请更新有关您正在运行代码的详细信息的问题,包括公共表名称并发布最小可重现示例。 stackoverflow.com/help/minimal-reproducible-example
  • @JohnHanley 你是什么意思临时表所以临时表像 SELECT * FROM ... WHERE Passenger_count 0 然后在这张表上的其余要求?这会加快速度吗?
  • 您是否根据要求的详细信息更新了您的问题?我提出了一个建议,测试和验证。
  • 是的,我确实编辑了它:)

标签: python performance api google-cloud-platform google-bigquery


【解决方案1】:

Use the BigQuery Storage API to download large results faster.

我在大约 1 分钟内得到了你的结果。

import pandas

sql ="SELECT passenger_count, trip_distance, pickup_longitude, pickup_latitude, dropoff_longitude, dropoff_latitude
        FROM `bigquery-public-data.new_york_taxi_trips.tlc_yellow_trips_2016`
        WHERE pickup_longitude IS NOT NULL
            AND pickup_latitude IS NOT NULL
            AND dropoff_longitude IS NOT NULL
            AND dropoff_latitude IS NOT NULL
            AND passenger_count < 7 AND passenger_count > 0
            AND pickup_longitude != 0.0 AND pickup_latitude  != 0.0
            AND dropoff_longitude  != 0.0 AND dropoff_latitude  != 0.0"

df = pandas.read_gbq(sql, dialect='standard', use_bqstorage_api=True)

您应该能够使用 google-cloud-bigquery 库和 Apache Arrow (Reference) 获得更快的结果

【讨论】:

    猜你喜欢
    • 2012-02-24
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多