【发布时间】: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