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

vdzxcuhz  于 2021-07-12  发布在  Spark
关注(0)|答案(2)|浏览(211)

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

+---------------+-------+
|category       |marks  |
+---------------+-------+
|cricket        |1.0    |
|tennis         |1.0    |
|football       |2.0    |
+---------------+-------+

我想把上面的Dataframe写进一个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文件而不是创建目录?

ghhaqwfi

ghhaqwfi1#

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"))
rqenqsqc

rqenqsqc2#

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

相关问题