Pyspark Spark Delta表更新

Pyspark Spark Delta表更新,pyspark,delta,Pyspark,Delta,我正在使用sparksql和pyspark在Microsoft Azure Databricks环境中工作。 所以我在湖面上有一个delta表,其中的数据按文件日期进行分区。每个分区都包含每天存储数百万条记录的文件,没有主键/唯一键。所有这些记录都有一个“status”列,该列可以包含NULL值(如果该特定记录上的所有内容看起来都很好),也可以不包含NULL值(例如,如果找不到特定列的特定查找映射)。此外,我的流程还包含另一个名为“mapping”的文件夹,该文件夹会定期刷新,比如说每夜刷新一次

我正在使用sparksql和pyspark在Microsoft Azure Databricks环境中工作。 所以我在湖面上有一个delta表,其中的数据按文件日期进行分区。每个分区都包含每天存储数百万条记录的文件,没有主键/唯一键。所有这些记录都有一个“status”列,该列可以包含NULL值(如果该特定记录上的所有内容看起来都很好),也可以不包含NULL值(例如,如果找不到特定列的特定查找映射)。此外,我的流程还包含另一个名为“mapping”的文件夹,该文件夹会定期刷新,比如说每夜刷新一次,以简化流程,从中可以找到映射

每天大约有100~200行出错(状态列包含非空值)。下游作业每天从这些文件中(因此是按文件\ u日期划分的)提取所有有效记录,并将其发送以供进一步处理,忽略那些100-200条错误记录,等待收到正确的映射文件。除了有效的状态记录外,下游作业还应尝试查看是否找到错误记录的映射,如果存在,还应进一步删除(当然,在使用适当的映射和状态更新数据湖之后)

最好的方式是什么?最好的方法是,首先直接使用正确的映射更新增量表/湖泊,并更新状态列,显示“可用于再处理”和我的下游作业,拉取当天的有效数据+拉取“可用于再处理”数据,处理后,将状态更新回“已处理”。但使用delta似乎非常困难

我看的是“”,这里的更新示例只是给出了一个简单的更新示例,其中包含要更新的常量,而不是来自多个表的更新

另一种但效率最低的方法是,提取过去30天内的所有数据(包括已处理和出错的数据),获取出错记录的映射,并使用replaceWhere选项将数据帧写回delta lake。这是超级低效的,因为我们正在读取所有内容(成百上千万条记录)并将所有内容写回,最多只处理1000条记录。如果在“”处搜索
deltaTable=deltaTable.forPath(spark,“/data/events/”
),则提供的示例用于非常简单的更新。如果没有唯一的密钥,也不可能更新特定记录。有人能帮忙吗


我使用pyspark或者可以使用sparksql,但是如果您想更新1列(“状态”),条件是现在对以前不正确的行(其中“状态”当前不正确)的所有查找都是正确的,我想
update
命令以及
EXISTS
可以帮助您解决这个问题。更新文档中没有提到它,但它适用于删除和更新操作,有效地允许您更新/删除连接上的记录

对于您的场景,我相信sql命令将如下所示:

UPDATE your_db.table_name AS a 
SET staus = 'correct'
  WHERE EXISTS 
  (
    SELECT * 
    FROM your_db.table_name AS b 
    JOIN lookup_table_1 AS t1 ON t1.lookup_column_a = b.lookup_column_a
    JOIN lookup_table_2 AS t2 ON t2.lookup_column_b = b.lookup_column_b
    -- ... add further lookups if needed
    WHERE
    b.staus = 'incorrect' AND
    a.lookup_column_a = b.lookup_column_a AND 
    a.lookup_column_b = b.lookup_column_b
  )
合并成功了

合并到deptdelta作为maindept 使用更新的部门位置作为upddept ON upddept.dno=主部门dno
匹配后,更新集maindept.dname=upddept.updated\u name,maindept.location=upddept.updated\u location

不幸的是,我还想从查找表中的值更新多个其他列,这就是挑战所在,然后可以使用类似的方法:将新匹配的值保存到某个位置,使用DELETE命令而不是UPDATE从该注释中的代码中删除不正确的行,然后将正确匹配的行追加到主表中