Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Apache Spark/Azure Data Lake存储—只处理文件一次,将文件标记为已处理_Apache Spark_Azure Data Lake_Delta Lake - Fatal编程技术网

Apache spark Apache Spark/Azure Data Lake存储—只处理文件一次,将文件标记为已处理

Apache spark Apache Spark/Azure Data Lake存储—只处理文件一次,将文件标记为已处理,apache-spark,azure-data-lake,delta-lake,Apache Spark,Azure Data Lake,Delta Lake,我有一个Azure Data Lake存储容器,作为Apache Spark处理JSON文件的登录区域 那里有成千上万个小文件(最多几MB)。Spark代码定期读取这些文件并执行一些转换 我希望文件只读取一次,并且Spark脚本是幂等的。 如何确保文件不会被反复读取?我如何以高效的方式完成它 我是这样读数据的: spark.read.json("/mnt/input_location/*.json") 我考虑了以下方法: 使用已处理的文件名创建增量表,并在输入数据帧上运行E

我有一个Azure Data Lake存储容器,作为Apache Spark处理JSON文件的登录区域

那里有成千上万个小文件(最多几MB)。Spark代码定期读取这些文件并执行一些转换

我希望文件只读取一次,并且Spark脚本是幂等的。 如何确保文件不会被反复读取?我如何以高效的方式完成它

我是这样读数据的:

spark.read.json("/mnt/input_location/*.json")
我考虑了以下方法:

  • 使用已处理的文件名创建增量表,并在输入数据帧上运行EXCEPT转换
  • 将处理过的文件移动到其他位置(或重命名)。我宁愿不那样做。如果我需要重新处理数据,我需要再次运行重命名。此操作需要很长时间

  • 我希望有更好的办法。请提出建议。

    您可以使用启用检查点的结构化流式作业和
    触发器。一旦

    该作业的检查点文件将跟踪作业已使用的JSON文件。此外,
    Trigger.Once
    Trigger将使此流式处理作业如同批处理作业一样

    有一篇很好的文章解释了“为什么流式处理和RunOnce比批量处理好”

    您的结构化流媒体作业可能如下所示:

    val checkpointLocation=“/path/to/checkpoints”
    val pathToJsonFiles=“/mnt/input_location/”
    val streamDF=spark.readStream.format(“json”).schema(jsonSchema).load(pathToJsonFiles)
    val query=streamDF
    […]//应用您的处理
    .writeStream
    .format(“控制台”)//相应地更改接收器格式
    .选项(“检查点位置”,检查点位置)
    .trigger(触发一次)
    .start()
    查询
    
    源数据是否已分区?嘿,迈克。谢谢你的建议。我很想采用这种方法,但我有两个问题:1-JSON模式非常复杂,很难将其作为一段代码来编写。2-我必须执行一些连接和其他操作,这些操作在结构化流媒体中无法正常工作。特别是出于第二个原因,我决定使用批处理。结构化流媒体的好处在于,它的工作方式几乎与批处理相同。如上所述,您可以删除
    .schrma(schema)
    ,并让spark推断模式,就像您在批处理代码中所做的那样。此外,由于只触发一次,因此生成的数据帧可以与批处理数据帧完全相同地进行预处理,并且可以以相同的方式进行连接。或者,您认为哪种操作不适合结构化流媒体?