我在“ / mnt / events-bronze”位置有一个铜级三角洲湖泊表(events_bronze),数据从kafka流到该表。现在,我希望能够从此表中流式传输并使用“ foreachBatch”更新到一个银色表(events_silver)中。这可以使用青铜表作为源来实现。但是,在初始运行期间,由于events_silver不存在,我不断收到错误消息说Delta表不存在,这很明显。那么我该如何创建具有与events_bronze相同结构的events_silver?我找不到DDL来做同样的事情。
def upsertToDelta(microBatchOutputDF: DataFrame, batchId: Long) {
DeltaTable.forPath(spark, "/mnt/events-silver").as("silver")
.merge(
microBatchOutputDF.as("bronze"),
"silver.id=bronze.id")
.whenMatched().updateAll()
.whenNotMatched().insertAll()
.execute()
}
events_bronze
.writeStream
.trigger(Trigger.ProcessingTime("120 seconds"))
.format("delta")
.foreachBatch(upsertToDelta _)
.outputMode("update")
.start()
在初始运行期间,问题在于没有为路径“ / mnt / events-silver”定义增量湖表。我不确定如何在首次运行时创建与“ / mnt / events-bronze”相同的结构。
答案 0 :(得分:2)
在开始流写入/合并之前,请检查表是否已存在。如果没有使用(events_bronze的)空数据框和架构创建一个
val exists = DeltaTable.isDeltaTable("/mnt/events-silver")
if (!exists) {
val emptyDF = spark.createDataFrame(spark.sparkContext.emptyRDD[Row], <schema of events_bronze>)
emptyDF
.write
.format("delta")
.mode(SaveMode.Overwrite)
.save("/mnt/events-silver")
}
表(Delta Lake元数据)在开始时只会创建一次,如果不存在则只会创建一次。如果作业全部重新启动,将显示该作业并跳过表创建
答案 1 :(得分:0)
您可以使用spark SQL检查表。首先在spark SQL下运行,它将给出青铜表的表定义 :
spark.sql("show create table event_bronze").show
获取DDL之后,只需将位置更改为Silver Table的路径并运行该语句就是spark SQL。
注意:使用“如果不存在则创建表...”,因为它不会在并发运行中失败。
答案 2 :(得分:0)
这是一个 pyspark 示例:
<structure name="JaCoCo Ant Example">
<classfiles>
<fileset dir="${result.classes.dir}" excludes="com/abc/services/*.class" />
</classfiles>
</structure>