Scala 2.12和Spark 2.2.1。我使用以下代码将DataFrame
的内容写入S3:
myDF.write.mode(SaveMode.Overwrite)
.parquet("s3n://com.example.mybucket/mydata.parquet")
当我在S3上转到com.example.mybucket
时,我实际上看到一个名为&#34; mydata.parquet &#34;的目录,以及< strong>文件名为&#34; mydata.parquet_ $ folder $ &#34; !!!如果我进入mydata.parquet
目录,我会在其下面看到两个文件:
_SUCCESS
;和part-<big-UUID>.snappy.parquet
而我只是希望看到一个名为mydata.parquet
的文件存在于存储桶的根目录中。
这里有什么问题(如果有的话,是什么?!?)或者这是Parquet文件格式的预期吗?如果是预期的,那是我应该读取的实际 Parquet文件:
mydata.parquet
目录?;或mydata.parquet_$folder$
档案?或mydata.parquet/part-<big-UUID>.snappy.parquet
?谢谢!
答案 0 :(得分:2)
mydata.parquet/part-<big-UUID>.snappy.parquet
是实际的拼花数据文件。但是,像Spark这样的工具通常会将数据集分成多个part
文件,并且希望指向包含多个文件的目录。 _SUCCESS
文件是一个简单的标志,表示写操作已完成。
答案 1 :(得分:1)
根据api保存parqueat文件,它保存在您提供的文件夹中。成功完成了这个过程的结果。
如果直接写入s3,S3会创建那些$文件夹。它会将临时文件夹和副本写入s3中的最终目标。原因是没有重命名的概念。
请查看s3-distcp以及DirectCommiter的性能问题。
答案 2 :(得分:1)
当spark使用目录(树)作为数据源时,所有以_或_开头的文件。被忽略了; s3n也将删除那些$ folder $的东西。因此,如果您使用新查询的路径,它将只接收该镶木地板文件。