【问题标题】:Partitioning Data by Year and Month based on long based date column using Pyspark使用 Pyspark 基于基于长的日期列按年和月对数据进行分区
【发布时间】:2021-10-12 00:58:19
【问题描述】:

我有以下数据框

root
 |-- id: long (nullable = false)
 |-- name: string (nullable = true)
 |-- school: string(nullable = true)
 |-- subject: string(nullable = true)
 |-- created_date: long(nullable = false) 

我想将数据存储在这个数据框中,根据 created_date 列按年份和月份划分。

newDataframe=originaldataframe.select(col("id"),col("name"),col("school"),col("subject"),date_format(from_unixtime(col["created_date"]/1000,"MM-dd-yyyy"),"MM-dd-yyyy")).cast('date')
    dataframePationed= newDataframe.withColumn("year", year(newDataframe.created_date)).withColumn("month", month(newDataframe.created_date)).drop("created_date")
    dataframePationed.write.partitionBy("year", "month").format("csv").save("path/to/partion/data")

但是在 long 数据类型转换日期格式后,如果我尝试打印 createdDate 列值显示为 null。我怎样才能正确地做到这一点?

【问题讨论】:

    标签: dataframe pyspark date-format partition


    【解决方案1】:

    如果我们将日期格式更改为 spark 的默认格式(“yyyy-MM-dd”)以外的任何格式并在转换后的列上使用 cast 方法,那么您将得到 null。

    您可以尝试以下任一代码:

    to_date(from_unixtime(col["created_date"]/1000))
    date_format(from_unixtime(col["created_date"]/1000),'MM-dd-yyyy')
    

    【讨论】:

    • 即使我根据您的回答进行更改后,值仍然为空
    • 编辑了答案,检查一下。
    • 如果日期格式为 yyyy-MM-dd,month() 和 year() 函数将给出正确的值。
    • date_format(from_unixtime(col["created_date"]/1000),'yyyy-MM-dd')。只有这行得通。谢谢
    猜你喜欢
    • 2022-11-27
    • 2018-10-15
    • 2017-01-25
    • 2016-09-19
    • 2022-06-12
    • 2021-10-21
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多