我有以下基于某些键的合并和截断表的过程.该过程看起来很好,但似乎存在一些性能问题



CREATE OR REPLACE PROCEDURE table_merge(keys Array)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.8'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'reverse_str'
AS
$$
from snowflake.snowpark.functions import when_matached
def table_merge(session,keys):
  df_src= session.table(source_table)
  df_tgt= session.table(target_table)
  key_conditon = None
  for key in deletion_keys:
    if condition = None:
       condition = df_src[key]==df_tgt[key]
    else:
        condition = condition & (df_src[key]==df_tgt[key])
  df_tgt.merge(df_src, condition, [when_matched().delete()])

  return 'Pass'
$$; 

当我运行上面的查询时,即使是3条记录也需要大约28秒?

因此,为了使用普通的snowflake查询判断执行情况,我try 使用以下查询

merge into  target_table t using (select "ID", "NAME" from source_table) s on s.ID = t.ID and s.NAME = t.NAME when matched then delete

但上面的查询已执行,但未按预期合并

预期数量:

  1. 将数据从源合并到目标
  2. 合并时,如果源中的键与目标表匹配,则截断目标表中的这些行,然后将源中的新数据插入到目标中
  3. Truncate的键应该是动态的,因此查询语句应该能够根据传递给过程的键截断行.

有什么改进查询的解决方案或建议吗?

推荐答案

我认为有两种方法可以解决这个问题.

选项1.删除和插入--因为有批量操作,所以速度更快.在您的py过程中,您的输入是键.所以, 先按键删除-

delete from target_table where keys in (select keys from src_table) and keys in (input_keys)

第二,插入来自源的数据-

insert into target_table  select * from src_table where keys in (input_keys)

选项2--使用合并.这将是较慢的,因为合并操作较慢.

merge into  target_table t using (select "ID" sid, "NAME" sname from source_table keys in (input_keys)) s on s.ID = t.ID and s.NAME = t.NAME when matched then UPDATE 
set  id=sid, name=sname;

你真的不需要删除它.您只需更新来自源的数据中的所有列.

Python-3.x相关问答推荐

类型的可变性对变量的作用域有影响吗?

无法使用Python发送带有参数和标头的POST请求

匹配语句NaN

找到在指定列的另一个分组中存在重复的行.

try 使用 GEKKO 求解非线性方程组.系统有多种解决方案,但 GEKKO 给出了错误的解决方案.我该如何解决?

使用 Python 在特定组的列中设置上限

在python中将字符串写入文本文件

删除括号和大括号中不必要的空格

ImportError:无法从jinja2导入名称escape

是否将dict转换为一个数据帧,每个值都有重复的键?

类型提示和链式赋值以及多重赋值

活动屏幕上的 PyQt4 中心窗口

为什么包含类的名称不被识别为返回值函数注释?

'~'(波浪号)运算符在 Python 中的应用

asyncio.Semaphore RuntimeError: Task got Future 附加到不同的循环

tensorflow 中 numpy.newaxis 的替代方案是什么?

Pandas 的 EMA 与股票的 EMA 不匹配?

如何在 Python 中计算两个包含字符串的列表的 Jaccard 相似度?

使用 python2 和 python3 创建一个 virtualenv

无 Python 错误/错误?