我希望spark能够持续监控目录,并在文件出现在该目录中时使用spark.readStream
读取CSV文件。
请不要包含Spark Streaming解决方案。我正在寻找一种方法来使用火花结构流。
答案 0 :(得分:8)
以下是此用例的完整解决方案案例:
如果您在独立模式下运行。您可以将驱动程序内存增加为:
bin/spark-shell --driver-memory 4G
无需像独立模式一样设置执行程序内存执行程序在驱动程序中运行。
在完成@ T.Gaweda的解决方案时,找到以下解决方案:
val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
.readStream
.option("sep", ";")
.schema(userSchema) // Specify schema of the csv files
.csv("/path/to/directory") // Equivalent to format("csv").load("/path/to/directory")
csvDf.writeStream.format("console").option("truncate","false").start()
现在spark将持续监视指定的目录,只要在目录中添加任何csv文件,就会在该文件上执行DataFrame操作“csvDF”。
注意:如果你想要火花传感,你必须先设置以下配置:
spark.sqlContext.setConf("spark.sql.streaming.schemaInference","true")
火花是你的火花会议。
答案 1 :(得分:2)
正如官方documentation所述,你应该使用" file"源:
文件来源 - 将目录中写入的文件作为数据流读取。支持的文件格式为text,csv,json,parquet。有关更新的列表,请参阅DataStreamReader接口的文档,以及每种文件格式支持的选项。请注意,文件必须原子放置在给定目录中,在大多数文件系统中,可以通过文件移动操作来实现。
从文档中获取的代码示例:
// Read all the csv files written atomically in a directory
val userSchema = new StructType().add("name", "string").add("age", "integer")
val csvDF = spark
.readStream
.option("sep", ";")
.schema(userSchema) // Specify schema of the csv files
.csv("/path/to/directory") // Equivalent to format("csv").load("/path/to/directory")
如果您没有指定触发器,Spark会尽快读取新文件