pyspark 如何在sparksql中高效地删除行?

lqfhib0f  于 2022-11-01  发布在  Spark
关注(0)|答案(1)|浏览(160)

我得到了一个视图,它的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具有所有唯一值,例如,如果columnNameempid,则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万次更改。因此,我将无法判断表中有多少百分比被删除。

ftf50wuq

ftf50wuq1#

如果EmpID没有很大的基数,你可以用它来划分你的数据,并且你可以使用Delta Lake 2.0或更新的版本,你可以依赖Delta Lake动态覆盖。这可能是你可能使用的最快的解决方案。

相关问题