【问题标题】:Export two tables from BigQuery to csv based on primary key根据主键将 BigQuery 中的两个表导出到 csv
【发布时间】:2019-10-16 07:31:37
【问题描述】:

我在 BigQuery 表中有 2 个表,它们经过聚合和处理,分别可能有多达 200 万和 1000 万行。

它们有非常不同的列,但每个列都是相同的主键 (IDXX)。 在表 1 中,每个 IDXX 对应一行,而在表 2 中,IDXX 最多可能有 10 行。

我想以匹配的块从 BigQuery 中导出这两个表。比如:

  • table1_chunk1.csv:应该有 IDXX:1 - 10(10 行)
  • table2_chunk1.csv:应该有 IDXX:1 - 10(最多 100 行)

  • table1_chunk2.csv:应该有 IDXX:11 - 20(10 行)

  • table2_chunk2.csv:应该有 IDXX:11 - 20(最多 100 行)

最好的方法是什么?使用云数据流?用 Bash 做吗?

【问题讨论】:

  • 不清楚分割成这四个块的预期逻辑是什么? ` 1 - 10 (10 rows)` 和 1 - 10 (could be up to 100 rows) 是什么意思? - 请澄清。

标签: google-cloud-platform google-bigquery google-cloud-dataflow


【解决方案1】:

这是一个非常广泛的问题,但我会尝试纯粹在 BigQuery 中解决它。

您需要的第一件事是对您的 id 进行某种静态排名。这样,您可以确定检索一组固定 id 的解决方案。因此,您可以创建一个(一次性)表,其中包含您的 id 的排名:

bq query --nouse_legacy_sql --allow_large_results --replace \ 
 --destination_table=dataset.ranking_table \ 
"select row_number() over () as rnk, id from dataset.table1"

一旦你有了这个静态的ranking_table,你就可以在不同的范围内重复创建你的块。例如(对于 1 - 10):

对于table1_chunk1

bq query --nouse_legacy_sql --allow_large_results --replace \ 
 --destination_table=dataset.table1_chunk1 \ 
"select a.* from dataset.table1 a join dataset.ranking_table b on b.id=a.id  
where b.rnk between 1 and 10"

对于table1_chunk2

bq query --nouse_legacy_sql --allow_large_results --replace \ 
 --destination_table=dataset.table2_chunk1 \ 
"select a.* from dataset.table2 a join dataset.ranking_table b on b.id=a.id 
where b.rnk between 1 and 10"

然后您可以将这些表中的数据导出到 GCS 存储桶,然后再导出到本地。假设你能弄清楚,我会留下那部分。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多