我正在使用spark scala读取大的json文件并将其推送到elasticsearch。
我使用dataFrame读取文件val df = spark.read.json(args(0))
。
我管理了传递给elasticsearch的数据,但是现在我试图“实时”读取同一目录中的多个文件。我的程序当前,两次读取相同的文件。我尝试在读取json文件后将其删除或将其重命名为“ .old” ==>,在这种情况下,我得到了fileNotFoundException。
因此,我正在尝试查找“读取时执行某些操作”,以通知Spark该文件不再可读。
这是我的追求
object savees {
def main(args: Array[String]) {
Logger.getLogger("org").setLevel(Level.WARN)
val conf = new SparkConf()
.setMaster("local[*]")
.setAppName("SaveEs")
.set("es.nodes", "127.0.0.1")
.set("es.nodes.wan.only", "false")
.set("es.port", "9200")
//.set("es.batch.size.entries", "2000")
.set("es.input.json", "true")
val actorSystem = ActorSystem()
val scheduler = actorSystem.scheduler
val task = new Runnable {
def run() {
val spark = SparkSession
.builder
.config(conf)
.getOrCreate()
import spark.implicits._
println("\n Reading data from :" + args(0).toString)
breakable(if (new File("/home/cloudera/Desktop/Orange/Orange.json").exists() == false) {
println("\n give a file!")
break
})
val df = spark.read.json(args(0))
df.show(1000, false)
for {
files <- Option(new File("/home/cloudera/Desktop/Orange/").listFiles)
file <- files if file.getName.endsWith(".json")
} file.renameTo(new File(file + ".old"))
val rdd = df.toJSON.rdd
println("\n Pushing data to :" + args(1))
EsSpark.saveToEs(rdd, args(1))
spark.close()
}
}
implicit val executor = actorSystem.dispatcher
scheduler.schedule(
initialDelay = Duration(10, TimeUnit.SECONDS),
interval = Duration(10, TimeUnit.SECONDS),
runnable = task)
}
}
谢谢你, 巴瑟姆