【问题标题】:How to update big query data according to mapping file?如何根据映射文件更新大查询数据?
【发布时间】:2021-11-30 19:38:39
【问题描述】:

我有一个存储在 Gcs 中的映射文件和一个大查询表。

df_mapping:

             Id     Values
             1      XZUP
             2      SJXC
             3      PALD
             4      QLOM
             5      DKCM

BQ_Table:

Id  Country  Market  Sales  Values
1   Canada   Hsp     2503   XZUP
2   Germany  Noe     2459   SJXC
3   Algeria  Zoe     4635   PALD
4   Brazil   Foe     6354   QLOM
5   Canada   Cmm     2588   XZUP

但是映射文件每次都会更改,如果映射文件更改我的 BQ 表值也应该根据映射文件更新,我正在寻找解决方案。

我做了什么:Everytime mapping file changes, i am triggering a function where i am reading bq table except "value" column & reading updated mapping file --> left join on Id column to get updated "values" --> Deleting my old bq table --> Inserting the new data.

query =  """
            SELECT
            Id,
            Country,
            Sales,
            Value
            FROM `project.dataset.tbl` 
            
        """

            bqclient = bigquery.Client()
            df = (
                bqclient.query(query)
                .result()
                .to_dataframe(create_bqstorage_client=True)
                )

df_mapping = pd.read_csv("gs://path/mapping.csv")
df_final = pd.merge(df, df_mapping, on='Id', how='left')
-- Not sure of Deleting and Inserting data safely

我不确定,删除旧表并插入新表是解决此问题的正确方法。

我看到的问题:

          1. After deleting my old table, error can come while inserting new data.
          2. Data is quite large to process ~1million.
          3. Not Scalable solution.
          4. Can loss Data.

有没有其他方法可以做到这一点,比如在 BQ 表中它引用我的映射文件或任何其他解决此任务的方法都会很棒。

【问题讨论】:

  • 当您说“我的映射文件每次都更改”时,更改的频率是多少?另外, pd.merge() 不会删除表。?当您说“删除旧表”时,您想指的是什么?
  • @Mr.Batra 频率将是每个 qtr,它不会改变映射文件中的所有 Id,但它可以改变一些 Id,所以我需要将 BQ 表中的这些值更改为值在那些特定 ID 的映射文件中。那么如何替换 bq 表中的那些 id 值呢?我曾经从 bq 表中读取数据,然后我使用更新的映射文件离开连接,这将在“值”列中提供更新的值。然后我曾经从表中删除旧数据,以便根据更新的映射插入新数据文件

标签: python pandas google-bigquery google-cloud-functions google-cloud-storage


【解决方案1】:

让我们试一试-

  • 在 BigQuery 中创建计划的 UPDATE 查询(“按需”)。在这里,您可以将 GCS 映射文件作为第一个 bq 表(外部表),将您的 BQ_Table 作为另一个 bq 表。只需编写一个更新查询来更新每个映射文件 BQ_Table 中的 Values 字段。
  • 创建一个云函数,以便在 GCS 中的映射数据更新后立即在预定查询之上运行。

【讨论】:

    【解决方案2】:

    您可以将映射参考存储在某处(在 CVS 格式的 GCS 中,在 Google Sheet 中以便于手动更新,也许在 Cloud SQL 数据库中),然后创建一个视图来连接您的数据和映射。

    这样,你总是有一个最新的日期,你不需要存储结果和管理它(更新/删除/重新创建)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-13
      • 2016-12-09
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      • 1970-01-01
      相关资源
      最近更新 更多