Apache spark ApacheSpark-基于时间加载数据

Apache spark ApacheSpark-基于时间加载数据,apache-spark,Apache Spark,我有一个用例,所有数据都存储在XML文件中。 考虑到还有另一个应用程序(远程运行)每天将这些文件放在S3位置(例如)。但是,并非所有文件都一次性上载到S3位置。我可能会在S3位置上得到一些XML文件,比如上午9点,下午1点有一些文件,下午6点有一些文件,其余的文件大约在晚上11点左右 这些文件的位置相同,所有文件仅使用日期分隔 我的Spark作业将在一天内运行4-5次,并处理这些文件。但是,作业不应在以前处理的文件上开始处理,而应在新添加的文件上开始处理 Spark是否提供了识别添加到该位置的新

我有一个用例,所有数据都存储在XML文件中。 考虑到还有另一个应用程序(远程运行)每天将这些文件放在S3位置(例如)。但是,并非所有文件都一次性上载到S3位置。我可能会在S3位置上得到一些XML文件,比如上午9点,下午1点有一些文件,下午6点有一些文件,其余的文件大约在晚上11点左右

这些文件的位置相同,所有文件仅使用日期分隔

我的Spark作业将在一天内运行4-5次,并处理这些文件。但是,作业不应在以前处理的文件上开始处理,而应在新添加的文件上开始处理

Spark是否提供了识别添加到该位置的新文件的方法

谢谢


Avinash Deshmukh

我研究过这种问题。如果您在使用流媒体时没有问题,我们可以通过spark结构化流媒体来实现这一点

val df = spark.readStream
      .option("wholetext", true)
      .text("<S3 Bucket URI>\*.xml")
      .as[String]
// with the above line each xml file content will be as single string

val writeDF = df.writeStream
      .option("checkpointLocation", "<S3 Bucket URI for checkpointing>")
      .outputMode("append")
      .foreach(new CustomWriter)
      .queryName("xml-processing")
//Here we have to provide another S3 URI for checkpointing,
//If xml is processed by spark, then make commit as read with spark internal

val process = writeDF.start()
process.awaitTermination()
val df=spark.readStream
.option(“wholetext”,true)
.text(“\*.xml”)
.作为[字符串]
//在上面的一行中,每个xml文件内容将作为单个字符串
val writeDF=df.writeStream
.option(“检查点位置”,“”)
.outputMode(“追加”)
.foreach(新客户编写器)
.queryName(“xml处理”)
//这里我们必须为检查点提供另一个S3URI,
//如果xml由spark处理,则使用spark internal将提交设置为读取
val进程=writeDF.start()
进程终止()
需要通过扩展
ForeachWriter
类来实现
CustomWriter
类。
因此,这里writer类将以字符串形式获取整个XML文件内容。

只是为了验证我的假设是否正确。如果我们在第2天,文件A、B、C和D在第1天上载并且已经处理,那么当文件E在第2天上载时,是否希望此上载触发Spark作业?如果在第2天上载文件E,然后在第2天上载文件F,则spark作业将在文件E和F上运行还是仅在文件F上运行?Spark作业是否只在最近上传的单个文件上运行?嗨,乔纳森,你的假设是正确的。第1天的文件A、B、C和D已上载,并已在第1天进行了处理(因为数据是按日期划分的)。如果文件E在第2天上传,并且Spark作业在上午6点左右运行,则文件E将得到处理。在同一天-第2天-如果文件F被上传并再次运行Spark作业,它应该只处理文件F而不是文件E。嗨,Ravi,谢谢你的回复。但是,我的应用程序不是流媒体作业。这是一个每天可能运行3-4次的批处理作业。