Spark Scala中的文件读取

时间:2019-01-23 12:18:34

标签: scala apache-spark amazon-s3 filereader

我正在尝试从s3存储桶逐行读取文件,并将df转换为RDD并将这些值传递给Variables。现在,我将这些变量作为参数传递给我的SQL查询。

我的代码:

import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.typedLit
import org.apache.spark.sql.functions._

object FileTest {
  def main(args: Array[String]) {
    val spark = SparkSession.builder.master("local[*]").appName("FileTest").getOrCreate()
    val sc = spark.sparkContext
    val conf = new SparkConf().setAppName("FileTest").setMaster("local[*]")
    val sqlContext = spark.sqlContext

    val fileread = spark.read.format("csv").option("inferSchhema","true").option("header","false").load("C:\\data\\FileParam.txt")
    fileread.createOrReplaceTempView("Tempdata")

    val filedata = spark.sql("select * from tempdata")
    filedata.createOrReplaceTempView("filedata")

    val rdd1=filedata.rdd

    rdd1.collect().foreach{
      x=>

        println(s"""select * from temp where id=${x(0)} and cid=${x(1)}, path1=${x(2)},path2=${x(3)}""")
        val id = x(0)
        val cid = x(1)
        val path1 = x(2)
        val path2= x(3)


        println(s""" values are ${id},${cid},${path1},${path2}""")
        val resfile = spark.sql(s"select * from filedata where _c1= ${cid}")

           val fileOutput = filedata.withColumn("x4", typedLit("OK")).write.format("csv").mode("append").save("s3a://test-bucket/TestFile/Test_result/Result.txt")
         }


   }
    spark.stop()
  }
}

我的问题是,每次要向FileParam.txt文件添加每行,我只想读取最新的数据,而不是循环读取所有记录。

我的文件如下:

FileParam.txt:

1,1001,s3a://test-bucket/folder1,s3a://test-bucket/folder2
2,1002,s3a://test-bucket/folder3,s3a://test-bucket/folder4

假设我的进程已读取所有上述记录,并且又有一个新记录附加到该文件,那么我只需要读取最新记录,而不是全部3条记录。

请帮助我如何解决此问题。

0 个答案:

没有答案