链接Delta Streams以编程方式引发AnalysisException

时间:2019-12-28 14:02:29

标签: 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中运行它时,它运行平稳。
不知道那里发生了什么,但肯定令人困惑。

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)

2 个答案:

答案 0 :(得分:0)

阅读错误消息后,我确实尝试做一个好孩子并遵循建议,因此我尝试确保增量中实际上有 IS 个有效数据我试图从 读取的文件夹中调用readStream,然后瞧瞧!


 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读取需要完成一些写操作-也许是元数据?-

但是,这仍然是一个hack。我希望可以从一个空的delta文件夹开始读取,然后等待内容开始倒入其中。

答案 1 :(得分:0)

来自Delta Lake Quick Guide - Troubleshooting

<块引用>
  • 表架构未设置错误
<块引用>

问题: 当 Delta 表的路径不存在时,尝试从中流式传输数据,您将收到以下错误。 org.apache.spark.sql.AnalysisException:未设置表架构。将数据写入其中或使用 CREATE TABLE 设置架构。;

<块引用>

解决办法: 确保已创建 Delta 表的路径。