S3 上的 Parquet 文件格式:哪个是实际的 Parquet 文件?

Parquet file format on S3: which is the actual Parquet file?

这里是 Scala 2.12 和 Spark 2.2.1。我用下面的代码把aDataFrame的内容写到S3:

myDF.write.mode(SaveMode.Overwrite)
  .parquet("s3n://com.example.mybucket/mydata.parquet")

当我转到 S3 上的 com.example.mybucket 时,我实际上看到一个名为“mydata.parquet”的 目录,以及名为“mydata.parquet_$folder$”的 file!!!如果我进入 mydata.parquet 目录,我会看到它下面有两个文件:

而我只是希望看到一个名为 mydata.parquet 的文件存在于存储桶的根目录中。

这里有什么问题吗(如果有,是什么?!?)或者这是 Parquet 文件格式所期望的?如果是预期的,这是我应该读取的 actual Parquet 文件:

  1. mydata.parquet 目录?;或
  2. mydata.parquet_$folder$ 文件?;或
  3. mydata.parquet/part-<big-UUID>.snappy.parquet?

谢谢!

mydata.parquet/part-<big-UUID>.snappy.parquet是实际的parquet数据文件。但是,像 Spark 这样的工具通常会将数据集分解为多个 part 文件,并期望指向包含多个文件的目录。 _SUCCESS 文件是一个简单的标志,表示写入操作已完成。

根据api保存parqueat文件,它保存在您提供的文件夹内。成功表示过程顺利完成。

如果您直接提交到 s3,S3 会创建这些 $ 文件夹。发生的事情是它写入临时文件夹并复制到 s3 内的最终目的地。原因是没有重命名的概念。

查看 s3-distcp 和 DirectCommiter 的性能问题。

  1. s3n/amazon 的 emrfs 使用 $folder$ 标记来指示 "empty directory"。忽略。
  2. 正如其他人所说,_SUCCESS 文件是一个 0 字节文件。忽略
  3. 目录中的所有其他 .parquet 文件都是输出;你最终得到的数字取决于在输入上执行的任务数量

当spark使用目录(树)作为数据源时,所有以_或.开头的文件。被忽略; s3n 也会删除那些 $folder$ 的东西。因此,如果您将路径用于新查询,它只会选取该镶木地板文件。