我得到了一个视图,它的ID必须在数据库的表中删除相应的记录。
查看方式:
|columnName|
------------
| 1 |
| 2 |
| 3 |
| 4 |
变量:
tableName = name of the table
columnName = match on this column
database = name of database
删除逻辑1
spark.sql("""DELETE FROM """+database+"""."""+tableName+""" WHERE """+columnName+""" IN ( """+st+""") """)
这里,st
具有所有唯一值,例如,如果columnName
是empid
,则st具有1,2,3,etc
,我使用python从视图中提取了该值。
第二次进近
spark.sql("""MERGE INTO database.tablename ... USING VIEW..... WHEN MATCHED THEN DELETE""")
这两种方法对我都有效。逻辑1比合并逻辑快得多,但它仍然需要20多分钟,因为我的表中有很多行。是否有方法可以改进这一点,以减少执行删除活动所需的时间?
编辑:完整的用例。我将用一个例子来试着解释完整的测试用例。
TableName: Employee Details
Database Name: emp_db
EmpID | InsertionDate | Field1 | Field2 | Field3 |
1 | 10-10-2014 | 01X | 2YXM | ABC |
1 | 10-10-2014 | 01Y | 3YXM | XYZ |
1 | 10-10-2014 | 01E | 4YXM | ABX |
1 | 10-10-2014 | 01A | 5YXM | DEF |
现在,我将获得2个视图,其中一个视图显示了有关该员工的所有详细信息,另一个视图显示了已更改的员工的列表。
View: global_temp.EmployeeDetails
EmpID | InsertionDate | Field1 | Field2 | Field3 |
1 | 10-12-2014 | 01Y | 2YXM | ABC |
1 | 10-12-2014 | 01P | 123X | ABY |
1 | 10-12-2014 | 01R | ABY | LMN |
2nd View: global_temp.IDS
|EmpID|
-------
1
在这里,IDS视图只有一条记录,因为在我们的示例中只有1个ID有更新的记录。
现在,我需要从视图中替换主表中EmpID 1的所有记录。为此,我首先从主表中删除ID 1的条目,然后插入global_temp.employeedetails视图中的所有条目。
对于有多少雇员id将得到更新没有限制,因此可能有几天只有1次更改,也可能有几天有10万次更改。因此,我将无法判断表中有多少百分比被删除。
1条答案
按热度按时间ftf50wuq1#
如果
EmpID
没有很大的基数,你可以用它来划分你的数据,并且你可以使用Delta Lake 2.0或更新的版本,你可以依赖Delta Lake动态覆盖。这可能是你可能使用的最快的解决方案。