【问题标题】:Best way to programatically run BigQuery Queries and upload into a table以编程方式运行 BigQuery 查询并上传到表中的最佳方式
【发布时间】:2015-09-14 21:43:22
【问题描述】:

我必须交叉连接 2 个当前失败的相当庞大的数据集。我想将数据集分成逻辑块。我计划使用 Python 按顺序运行查询,其中的变量在每次循环运行期间都会发生变化,例如:

while x <= 100:
  #Code to query in BigQuery: [SELECT * FROM table1 CROSS JOIN table2 WHERE table1.field = 'x'] then write the query results to a JSON file or upload directly in BigQuery
  x += 1 #X is a counter

看起来来自单个 bigquery 查询的响应是一个 JSON 文件,但我一直在弄清楚如何上传并将其附加到表中。当我尝试在 BigQuery 中手动上传 JSON 文件时,它会出错 - 我不完全确定如何格式化它以便 BigQuery 正确读取它。

问题: 1. 这是一个好方法吗? 2. 如何准备 JSON 文件以使其在 BigQuery 中成功上传? 3. 自动执行此操作的最佳方法是什么? (大概是通过API)

【问题讨论】:

    标签: python json google-bigquery


    【解决方案1】:

    可在此处找到有关在 BigQuery 中提取数据的信息: https://cloud.google.com/bigquery/preparing-data-for-bigquery

    但是,我不确定您的场景和您的问题是如何联系起来的。为什么需要以 JSON 格式上传数据才能运行此查询(假设 table1 和 table2 已经在 BQ 中)?

    另外,为什么需要执行交叉连接?交叉连接可能非常昂贵,因为如果您交叉连接两个大型表,您的输出将变得难以管理。 BQ 中交叉连接的主要用途是通过交叉连接模拟更复杂的连接条件(例如&lt;=),然后立即过滤输出。不过,即使这样也很昂贵,所以我鼓励您考虑其他方法来计算您想要的答案。

    【讨论】:

    • 完全理解 re:cross 连接。不过,我和我的大多数同龄人都想不出另一种方法。我们有 2 个带有地理空间点的表(x,y,timestamp),我们需要知道 2 个点何时彼此靠近。我们使用了分而治之的方法来打破它,但有足够的部分我需要这样做。
    • 为了回答您关于 JSON 的问题,我只想要一种可以从 python 手动上传来测试一些东西的方法 - 不是必需的。在 BQ 中使用不断变化的变量多次运行查询并将所有结果转储到一个表中的最佳方法是什么?
    • 你对“近”的定义是什么?如果它在有界距离内,那么也许您可以按位置将点分配给存储桶,然后加入这些存储桶。您可以采取任何措施来减小交叉连接的大小都会非常有帮助(更不用说更便宜了!)。
    • 如果这只是用于手动测试,我建议使用“bq”命令行工具或 Web UI。如果您想从 Python 编写代码,请尝试使用 bigquery_client.py 以获得更好的界面。要查看写入数据的位置以及如何追加与覆盖的所有选项,请参阅此处的查询选项:cloud.google.com/bigquery/docs/reference/v2/…
    • 如果你真的想要了解血腥的细节,这里是信息的权威来源:amazon.com/Google-BigQuery-Analytics-Jordan-Tigani/dp/…
    猜你喜欢
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多