Scala Spark编写压缩的CSV,带有到S3的自定义路径
我尝试使用Scala中编写的Spark将CSV简单地写入S3: 我注意到在我的输出桶中有以下文件:Scala Spark编写压缩的CSV,带有到S3的自定义路径,scala,apache-spark,Scala,Apache Spark,我尝试使用Scala中编写的Spark将CSV简单地写入S3: 我注意到在我的输出桶中有以下文件: …已处理/montfh-04.csv/part-00000-723a3d72-56f6-4e62-b627-9a181a820f6a-c000.csv.snappy 当它只应为montfh-04.csv时 代码: 在这里,我注意到两件奇怪的事情: 它把它放在一个目录中 它使用snappy压缩将奇怪的零件子路径添加到文件中 我所要做的只是将一个具有该名称的平面CSV文件写入指定路径。我的选择是什
…已处理/montfh-04.csv/part-00000-723a3d72-56f6-4e62-b627-9a181a820f6a-c000.csv.snappy
当它只应为montfh-04.csv时
代码:
在这里,我注意到两件奇怪的事情:
- 它把它放在一个目录中
- 它使用snappy压缩将奇怪的零件子路径添加到文件中
我所要做的只是将一个具有该名称的平面CSV文件写入指定路径。我的选择是什么?这就是spark的工作原理。为保存DataSet/DataFrame提供的位置是spark可以写入其所有分区的目录位置。
零件文件的数量将等于分区的数量,在您的情况下,分区的数量仅为1
现在,如果希望文件名仅为montfh-04.csv,则可以重命名它
注意:S3中的重命名操作成本很高(复制和删除)。当您使用spark编写时,它将是I/O的3倍,是输出提交操作的2倍,是重命名操作的1倍。最好用HDFS编写,然后用所需的密钥名从那里上传。spark就是这样工作的。为保存DataSet/DataFrame提供的位置是spark可以写入其所有分区的目录位置。
零件文件的数量将等于分区的数量,在您的情况下,分区的数量仅为1
现在,如果希望文件名仅为montfh-04.csv,则可以重命名它
注意:S3中的重命名操作成本很高(复制和删除)。当您使用spark编写时,它将是I/O的3倍,是输出提交操作的2倍,是重命名操作的1倍。最好用HDFS编写,然后用所需的密钥名从那里上传。谢谢。我想我只需要使用目录,并根据需要覆盖目录,以使我的简单用例保持简单。谢谢你的信息谢谢。我想我只需要使用目录,并根据需要覆盖目录,以使我的简单用例保持简单。谢谢你的信息
val processedMetadataDf = spark.read.csv("s3://" + metadataPath + "/PROCESSED/" + "month-04" + ".csv")
val processCount = processedMetadataDf.count()
if (processCount == 0) {
// Initial frame is 0B -> Overwrite with path
val newDat = Seq("dummy-row-data")
val unknown_df = newDat.toDF()
unknown_df.write.mode("overwrite").option("header","false").csv("s3://" + metadataPath + "/PROCESSED/" + "montfh-04" + ".csv")
}