使用dataframe scala创建一个以时间戳作为文件名的csv文件

使用dataframe scala创建一个以时间戳作为文件名的csv文件,scala,dataframe,csv,apache-spark,Scala,Dataframe,Csv,Apache Spark,我有一个数据框,数据如下 +---------------+-------+ |category |marks | +---------------+-------+ |cricket |1.0 | |tennis |1.0 | |football |2.0 | +---------------+-------+ 我想将上面的数据帧写入一个csv文件,在该文件中,将使用当前时间戳创建文件名 generatedDataFr

我有一个数据框,数据如下

+---------------+-------+
|category       |marks  |
+---------------+-------+
|cricket        |1.0    |
|tennis         |1.0    |
|football       |2.0    |
+---------------+-------+
我想将上面的数据帧写入一个csv文件,在该文件中,将使用当前时间戳创建文件名

generatedDataFrame.write.mode ("append")
    .format("com.databricks.spark.csv").option("delimiter", ";").save("./src/main/resources-"+LocalDateTime.now()+".csv")
但是这个代码不能正常工作。给出以下错误

java.io.IOException: Mkdirs failed to create file

使用scala和spark有更好的方法来实现这一点吗?而且,即使我试图创建带有时间戳代码的文件,也会创建一个带有时间戳的目录,并且在该目录中,会使用随机名称创建一个包含数据的csv。如何将时间戳文件名添加到这些csv文件中,而不是创建目录?

您应该使用src/main/resources,而不是。/src/main/resources。您可以从命令行检查目录创建的权限。另外,直接在路径中使用LocalDateTime.now将类似于“2021-03-01T13:39:09.646”,不确定这是否是您想要的,甚至不确定它是否对HDFS路径有效(类似[:]的字符),因此建议也使用日期格式。

DF.write.csv将始终使用指定的名称创建一个文件夹,并将输出的csv文件放置在该文件夹中

如果希望将单个csv文件作为输出,并将名称作为时间戳,则可以使用以下代码:

import java.text.SimpleDateFormat
import java.util.Date
import org.apache.spark.sql._
import org.apache.hadoop.fs.{FileSystem, Path}

val spark = SparkSession.builder().master("local[*]").getOrCreate()
spark.sparkContext.setLogLevel("ERROR")

val fs = FileSystem.get(spark.sparkContext.hadoopConfiguration)

generatedDataFrame.coalesce(1).write.mode("append").csv("./src/main/resources/outputcsv/")

val outFileName = fs.globStatus(new Path("./src/main/resources/outputcsv/part*"))(0).getPath.getName

val timestamp = new SimpleDateFormat("yyyyMMddHHmm").format(new Date())

fs.rename(new Path(s"./src/main/resources/outputcsv/$outFileName"), new Path(s"./src/main/resources/outputcsv/${timestamp}.csv"))