我使用Spark Structured Streaming的流式查询使用以下代码将镶木地板文件写入S3:
ds.writeStream().format("parquet").outputMode(OutputMode.Append())
.option("queryName", "myStreamingQuery")
.option("checkpointLocation", "s3a://my-kafka-offset-bucket-name/")
.option("path", "s3a://my-data-output-bucket-name/")
.partitionBy("createdat")
.start();
我在s3存储桶my-data-output-bucket-name
中获得了所需的输出,但随着输出,我得到了_spark_metadata
文件夹。如何摆脱它?如果我无法摆脱它,如何将它的位置更改为不同的S3存储桶?
答案 0 :(得分:6)
我的理解是,Spark 2.3可以 。
元数据目录的名称始终为_spark_metadata
_spark_metadata
目录始终位于path
选项指向的位置
我认为“修复”它的唯一方法是在Apache Spark's JIRA中报告问题,并希望有人会选择它。
流程是DataSource
请求流式查询的create the sink并采用path
选项。有了它,它就会创建一个FileStreamSink。 path
选项只会成为写入结果的basePath以及元数据。
您可以找到initial commit对于理解元数据目录的用途非常有用。
为了在保持一次语义的同时正确处理部分失败,每个批处理的文件都写出到一个唯一的目录,然后原子地附加到元数据日志中。当基于
DataSource
的镶木地板被初始化以供阅读时,我们首先检查此日志目录并在存在时使用它而不是文件列表。