如何快速查询 GCP 表

Posted

技术标签:

【中文标题】如何快速查询 GCP 表【英文标题】:How to query GCP tables fast 【发布时间】: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 的结果创建一个临时表,然后使用其余查询要求查询该临时表。此外,请更新有关您正在运行代码的详细信息的问题,包括公共表名称并发布最小可重现示例。 ***.com/help/minimal-reproducible-example @JohnHanley 你是什么意思临时表所以临时表像 SELECT * FROM ... WHERE Passenger_count 0 然后在这张表上的其余要求?这会加快速度吗? 您是否根据要求的详细信息更新了您的问题?我提出了一个建议,测试和验证。 是的,我确实编辑了它:) 【参考方案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) 获得更快的结果

【讨论】:

以上是关于如何快速查询 GCP 表的主要内容,如果未能解决你的问题,请参考以下文章

在SQL中如何快速查询某条记录在所有表中是不是存在?

教你快速学会连接查询

教你快速学会连接查询

教你快速学会连接查询

如何进行快速查询

353mysql查询每个表的数据量_大厂面试官:千万级数据量的表,如何进行快速查询?