Apache spark 以编程方式链接增量流引发AnalysisException

Apache spark 以编程方式链接增量流引发AnalysisException,apache-spark,spark-structured-streaming,delta-lake,Apache Spark,Spark Structured Streaming,Delta Lake,情况:我正在生成一个增量文件夹,其中包含来自上一个流式查询a的数据,然后从另一个DF读取数据,如下所示 DF_OUT.writeStream.format("delta").(...).start("path") (...) DF_IN = spark.readStream.format("delta").load("path) 1-当我试图在后续的readStream(ETL管道的链接查询)中以这种方式读取它时,来自同一程序我最终遇到以下异常 2-当我在scala REPL中运行它时,它

情况:我正在生成一个增量文件夹,其中包含来自上一个流式查询a的数据,然后从另一个DF读取数据,如下所示

DF_OUT.writeStream.format("delta").(...).start("path")

(...)

DF_IN = spark.readStream.format("delta").load("path)
1-当我试图在后续的readStream(ETL管道的链接查询)中以这种方式读取它时,来自同一程序我最终遇到以下异常

2-当我在scala REPL中运行它时,它运行平稳
不确定那里发生了什么,但确实令人费解

org.apache.spark.sql.AnalysisException: Table schema is not set.  Write data into it or use CREATE TABLE to set the schema.;
  at org.apache.spark.sql.delta.DeltaErrors$.schemaNotSetException(DeltaErrors.scala:365)
  at org.apache.spark.sql.delta.sources.DeltaDataSource.sourceSchema(DeltaDataSource.scala:74)
  at org.apache.spark.sql.execution.datasources.DataSource.sourceSchema(DataSource.scala:209)
  at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo$lzycompute(DataSource.scala:95)
  at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo(DataSource.scala:95)
  at org.apache.spark.sql.execution.streaming.StreamingRelation$.apply(StreamingRelation.scala:33)
  at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:171)
  at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:225)
  at org.apache.spark.ui.DeltaPipeline$.main(DeltaPipeline.scala:114)


在阅读了错误消息之后,我确实试着做一个好孩子并遵循建议,因此我尝试在调用readStream之前,确保我试图读取的delta文件夹中确实存在有效数据,瞧


 def hasFiles(dir: String):Boolean = {
        val d = new File(dir)
        if (d.exists && d.isDirectory) {
                d.listFiles.filter(_.isFile).size > 0
        } else false
   }

DF_OUT.writeStream.format("delta").(...).start(DELTA_DIR)

while(!hasFiles(DELTA_DIR)){
         print("DELTA FOLDER STILL EMPTY")
         Thread.sleep(10000)
      }

print("FOUND DATA ON DELTA A - WAITING 30 SEC")
Thread.sleep(30000)

DF_IN = spark.readStream.format("delta").load(DELTA_DIR)

它最终成功了,但我必须确保等待足够的时间来“发生一些事情”(不知道具体的TBH是什么,但似乎从delta读取需要一些写入才能完成-可能是元数据-

然而,这仍然是一种黑客行为。我希望可以从一个空的delta文件夹开始阅读,然后等待内容开始涌入其中。

来自:

  • 未设置表架构错误
问题: 当增量表的路径不存在,并尝试从中流式传输数据时,您将得到以下错误。 org.apache.spark.sql.AnalysisException:未设置表架构。请将数据写入其中或使用“创建表”设置架构

解决方案: 确保创建了增量表的路径


创建一个空的零版本的Delta Lake如何?只需保存一个空数据集即可初始化它?例如,
spark.emptyDataset[(长,字符串)].write.format(“Delta”).save(“/tmp/Delta/t1”)
?@JacekLaskowski我考虑过这一点,但我不知道这是否会影响我的模式,因为一旦我将真实数据写入其中,就会有一个模式。所以我没有这么做。因为你是这个主题上备受尊敬的专家,我不会对你的建议产生怀疑,我会尝试一下,并发布我用于z的结果ero版本是流式查询的模式,因此没有模式不匹配。