如何根据本地 csv 的 where 子句从 pandas 访问 Google Bigquery 数据

Posted

技术标签:

【中文标题】如何根据本地 csv 的 where 子句从 pandas 访问 Google Bigquery 数据【英文标题】:How to access Google Bigquery data from pandas, based on where clause from a local csv 【发布时间】:2016-12-25 04:37:52 【问题描述】:

所以我有一个名为 Frames 的本地数据框,其中有一列 item。 我想从 Google BigQuery 数据集 Sales 中提取信息。 Sales 有一列 itemnumber,我只想获取 Frames 中存在的值强>.项目

我需要执行以下操作:

frames=pd.DataFrame.from_csv(path,index_col=None)
df = gbq.read_gbq('SELECT * FROM Usales.Sales where itemnumber in frames.item LIMIT 1000', project_id='Project')

【问题讨论】:

你能不能把 Frames 放到 bigquery 中然后你呢:SELECT * FROM Usales.Sales where itemnumber in (select distinct item from frames) 理论上,是的,我可以,但有访问限制,因此这是不可行的。 【参考方案1】:
frames=pd.DataFrame.from_csv(path,index_col=None)
df = gbq.read_gbq('SELECT * FROM Usales.Sales where itemnumber in () LIMIT 1000'.format(', '.join('"0"'.format(item) for item in frames['item'].tolist())), project_id='project')

【讨论】:

需要调整使用连接的部分。截至目前,format(','.join(frames['item'].tolist())) 会生成一个数组,例如:(abc,cde,efg,xyz) 而不是生成这样的数组:("abc","cde","xyz") 你是对的 - 我编辑了我的回复,现在应该可以了。 酷,这对我有用,它在中间的某个地方缺少了一个讨厌的括号。 df = gbq.read_gbq('SELECT * FROM Usales.Sales where itemnumber in () LIMIT 1000'.format(', '.join('"0"'.format(item) for item in frames['item'].tolist())), project_id='project')【参考方案2】:

您需要将应用GBQ部分的部分与pandas DataFrame应用部分分开。

例如

def getDataForAnItem(item):
  # process item using gbq
  print(item)
  return  gbq.read_gbq('SELECT * FROM Usales.Sales where itemnumber in frames."+str(item)+" LIMIT 1000', project_id='Project')

frames=pd.DataFrame.from_csv(path,index_col=None)
resultDF = df['item'].apply(getDataForAnItem) 

【讨论】:

这可行,但它不是将字符串数组传递给 BiqQuery 并请求总共 1000 行,而是一次遍历 Frames.Item 列并为每个项目传递 1000 行。跨度>

以上是关于如何根据本地 csv 的 where 子句从 pandas 访问 Google Bigquery 数据的主要内容,如果未能解决你的问题,请参考以下文章

跳出查询以在存储过程中从单独的表中获取 where 子句

如何从 Firestore 7.24.0 实例中查询具有多个 where 子句的数据?

Redshift - 在 where 子句中从 csv 传递值

mysql加载数据infile where子句

根据 WHERE IN 子句数据排序结果集

如何在 switch 语句中使用 laravel 模型运行多个 Where 子句