使用python从bigquery提取数据时,Linux服务器上出现内存错误?

时间:2019-04-05 09:11:32

标签: python google-bigquery

我正在尝试使用python从大查询中获取数据。该代码在我的笔记本电脑上运行良好,但在Linux服务器上引发了内存错误。是否可以对其进行优化,使其也可以在服务器上运行?

错误:表有500万行... Linux计算机具有8 GB内存。...错误“内存不足”,进程被杀死

下面是代码:

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/Users/Desktop/big_query_test/soy-serenity-89ed73.json"

client = bigquery.Client()

# Perform a query.

QUERY = “SELECT * FROM `soy-serenity-89ed73.events10`”


query_job = client.query(QUERY)

df = query_job.to_dataframe()

1 个答案:

答案 0 :(得分:0)

我可以建议两种方法:

选项1
SELECT以块为单位的数据,以减少每次迭代从BigQuery接收到的数据的大小。 例如,您的表是分区,您可以执行以下操作:

WHERE _PARTITIONTIME = currentLoopDate

其中currentLoopDate将是您的python代码中的日期变量(类似的选择是使用ROW_NUMBER

选项2
通过使用BigQuery client library,您可以使用 Jobs.insert API并将configuration.query.priority设置为批处理。

# from google.cloud import bigquery
# client = bigquery.Client()

query = (
    'SELECT name FROM `bigquery-public-data.usa_names.usa_1910_2013` '
    'WHERE state = "TX" '
    'LIMIT 100')
query_job = client.query(
    query,
    # Location must match that of the dataset(s) referenced in the query.
    location='US')  # API request - starts the query

for row in query_job:  # API request - fetches results
    # Row values can be accessed by field name or index
    assert row[0] == row.name == row['name']
    print(row)

有关更多详细信息,请参见此link 在获得jobId之后,使用Jobs.getQueryResults编写一个循环,通过设置API的maxResults参数来获取数据块