情况:我正在使用来自先前的流查询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)
答案 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 表的路径。