我正在使用三角洲湖泊(“ io.delta” %%“ delta-core”%“ 0.4.0”)并合并到foreachBatch中,例如:
foreachBatch { (s, batchid) =>
deltaTable.alias("t")
.merge(
s.as("s"),
"s.eventid = t.eventid and t.categories in ('a1', 'a2')")
.whenMatched("s.eventtime < t.eventtime").updateAll()
.whenNotMatched().insertAll()
.execute()
}
增量表按类别进行分区。如果我添加分区过滤器,如“和(.a1,'a2')中的t.categories”,从火花图中可以看到输入不是整个表。我认为它确实进行了分区修剪。但是,如果我这样做: “ s.eventid = t.eventid和t.categories = s.categories”,它仍然从增量表中加载所有数据。我希望它可以自动检测应该进行连接的分区,例如下推式。可以在不指定特定分区值的情况下对分区进行修剪吗?我还尝试添加(“ spark.databricks.optimizer.dynamicPartitionPruning”,“ true”),但不起作用。
谢谢
答案 0 :(得分:0)
您可以通过两种方式进行传递。一种是传递值的静态方法,另一种是您在merge语句中动态设置分区。
val categoriesList = List("a1", "a2")
val catergoryPartitionList = categoriesList.mkString("','")
foreachBatch { (s, batchid) =>
deltaTable.alias("t")
.merge(
s.as("s"),
"s.eventid = t.eventid and t.categories in ('$catergoryPartitionList')")
.whenMatched("s.eventtime < t.eventtime").updateAll()
.whenNotMatched().insertAll()
.execute()
}
val selectedCategories = deltaTable.select("categories").dropDuplicates()
val categoriesList = selectedCategories.map(_.getString(0)).collect()
val catergoryPartitionList = categoriesList.mkString("','")
foreachBatch { (s, batchid) =>
deltaTable.alias("t")
.merge(
s.as("s"),
"s.eventid = t.eventid and t.categories in ('$catergoryPartitionList')")
.whenMatched("s.eventtime < t.eventtime").updateAll()
.whenNotMatched().insertAll()
.execute()
}