Apache spark 以编程方式链接增量流引发AnalysisException
情况:我正在生成一个增量文件夹,其中包含来自上一个流式查询a的数据,然后从另一个DF读取数据,如下所示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中运行它时,它
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文件夹开始阅读,然后等待内容开始涌入其中。来自:
- 未设置表架构错误
创建一个空的零版本的Delta Lake如何?只需保存一个空数据集即可初始化它?例如,
spark.emptyDataset[(长,字符串)].write.format(“Delta”).save(“/tmp/Delta/t1”)
?@JacekLaskowski我考虑过这一点,但我不知道这是否会影响我的模式,因为一旦我将真实数据写入其中,就会有一个模式。所以我没有这么做。因为你是这个主题上备受尊敬的专家,我不会对你的建议产生怀疑,我会尝试一下,并发布我用于z的结果ero版本是流式查询的模式,因此没有模式不匹配。