三角洲湖创建表与另一个结构

时间:2019-10-04 19:29:19

标签: apache-spark databricks spark-structured-streaming delta-lake

我在“ / 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”相同的结构。

3 个答案:

答案 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>