标量,避免使用数据框读取文件两次

时间:2018-07-27 10:42:10

标签: scala apache-spark elasticsearch spark-streaming

我正在使用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)

    }
}

谢谢你, 巴瑟姆

0 个答案:

没有答案