如何在Spark结构化流中读取Orc数据源?

时间:2018-12-19 12:14:51

标签: java scala apache-spark spark-streaming spark-structured-streaming

我正在尝试在Java中读取orc流:

数据集d2 = sparkSession.readStream()。format(“ orc”).option(“ path”,“ file:/// Users / rahulkumar / work / structuredstreaming / maporc /”).load();

会引发以下错误

Exception in thread "main" java.lang.IllegalArgumentException: Schema must be specified when creating a streaming source DataFrame. If some files already exist in the directory, then depending on the file format you may be able to create a static DataFrame on that directory with 'spark.read.load(directory)' and infer schema from it.
    at org.apache.spark.sql.execution.datasources.DataSource.sourceSchema(DataSource.scala:222)
    at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo$lzycompute(DataSource.scala:88)
    at org.apache.spark.sql.execution.datasources.DataSource.sourceInfo(DataSource.scala:88)
    at org.apache.spark.sql.execution.streaming.StreamingRelation$.apply(StreamingRelation.scala:30)
    at org.apache.spark.sql.streaming.DataStreamReader.load(DataStreamReader.scala:150)
}

在批处理模式中,默认情况下是从orc文件派生的。我在这里也期望如此,但它不起作用。

1 个答案:

答案 0 :(得分:0)

  

默认情况下,基于文件的源的结构化流要求您指定架构,而不是依靠Spark自动推断。此限制确保即使在发生故障的情况下,也将一致的架构用于流查询。对于临时用例,可以通过将spark.sql.streaming.schemaInference设置为true来重新启用模式推断。

来源:https://spark.apache.org/docs/latest/structured-streaming-programming-guide.html#schema-inference-and-partition-of-streaming-dataframesdatasets


总的来说,我说在生产环境中依赖于批处理作业的模式推断是一个坏主意。
首先,这是一个复杂的过程,将消耗计算时间。
其次,无论您尝试对数据进行哪种处理,您都肯定会采用某种模式。因此,为什么不从头开始执行它,而一旦数据与您的假设不符就立即失败。

模式推断非常适合在交互式环境(例如spark-shell)上进行数据探索性测试,以使您了解数据的组成方式以及如何使用它。 br /> 在这种情况下,除非您也正在测试该功能,否则我怀疑您是否需要流式传输-如果是这种情况((并且我确定它是确定的路径)),则可以使用上述设置。 >


尽管如此,我还是建议使用数据集代替 DataFrames (和 Scala 代替 Java 来强制执行类型安全,这样您就可以创建一个case class来表示您的数据并从中导出模式-但是,这只是我个人的偏爱和看法。