【问题标题】:Create a csv file with timestamp as file name using a dataframe scala使用数据框 scala 创建一个以时间戳为文件名的 csv 文件
【发布时间】:2021-05-31 04:52:18
【问题描述】:

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

+---------------+-------+
|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 文件的时间戳文件名而不是创建目录?

【问题讨论】:

    标签: scala dataframe csv apache-spark


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-04-09
        • 1970-01-01
        • 2015-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-09
        相关资源
        最近更新 更多