我正在尝试从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条记录。
请帮助我如何解决此问题。