【问题标题】:Timestamp changes format when writing to csv file spark写入 csv 文件 spark 时时间戳更改格式
【发布时间】:2021-01-24 01:16:32
【问题描述】:

我正在尝试将数据帧保存到包含时间戳的 csv 文件中。

此列更改csv文件中格式一的问题。这是我使用的代码:

    val spark = SparkSession.builder.master("local").appName("my-spark-app").getOrCreate()
    
    val df = spark.read.option("header",true).option("inferSchema", "true").csv("C:/Users/mhattabi/Desktop/dataTest2.csv")
    //val df = spark.read.option("header",true).option("inferSchema", "true").csv("C:\\dataSet.csv\\datasetTest.csv")
    //convert all column to numeric value in order to apply aggregation function 
    df.columns.map { c  =>df.withColumn(c, col(c).cast("int")) }
    //add a new column inluding the new timestamp column
    val result2=df.withColumn("new_time",((unix_timestamp(col("time"))/300).cast("long") * 300).cast("timestamp")).drop("time")
    val finalresult=result2.groupBy("new_time").agg(result2.drop("new_time").columns.map((_ -> "mean")).toMap).sort("new_time") //agg(avg(all columns..)
   finalresult.coalesce(1).write.option("header",true).option("inferSchema","true").csv("C:/mydata.csv")

当通过 df.show 显示时,它的格式正确

但在 csv 文件中,它采用这种格式:

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    使用选项将时间戳格式化为您需要的时间戳:

    finalresult.coalesce(1).write.option("header",true).option("inferSchema","true").option("dateFormat", "yyyy-MM-dd HH:mm:ss").csv("C:/mydata.csv")
    

    finalresult.coalesce(1).write.format("csv").option("delimiter", "\t").option("header",true).option("inferSchema","true").option("dateFormat", "yyyy-MM-dd HH:mm:ss").option("escape", "\\").save("C:/mydata.csv")
    

    【讨论】:

    • 我尝试了你的两个选项,但我在列时间戳上遇到了同样的问题
    • dateFormat 选项修改日期; timestampFormat 修改时间戳。试试timestampFormat 选项。
    • 面临同样的问题,你找到解决方案了吗?
    【解决方案2】:

    这是用于修改时间戳的 CSV 输出格式的代码 sn-p。

    我需要一个“T”字符,而不是秒或微秒。 timestampFormat 选项确实适用于此。

    DF.write
    .mode(SaveMode.Overwrite)
    .option("timestampFormat", "yyyy-MM-dd'T'HH:mm")
    

    2017-02-20T06:53

    如果你用空格代替“T”,那么你会得到:

    DF.write
    .mode(SaveMode.Overwrite)
    .option("timestampFormat", "yyyy-MM-dd HH:mm")
    

    2017-02-20 06:53

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-21
      • 2018-11-27
      • 2021-11-06
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 2020-01-31
      相关资源
      最近更新 更多