首页 > 解决方案 > 按时间戳写入分区数据

问题描述

我有一些数据,它的时间戳列字段很长并且它的时代标准,我需要使用 spark scala 以 yyyy/mm/dd/hh 等拆分格式保存该数据

data.write.partitionBy("timestamp").format("orc").save("mypath") 

这只是按时间戳拆分数据,如下所示

timestamp=1458444061098
timestamp=1458444061198

但我希望它像

└── YYYY
    └── MM
        └── DD
            └── HH

标签: scalaapache-sparkapache-spark-sql

解决方案


您可以为此利用各种 spark sql 日期/时间函数。首先,添加一个从 unix 时间戳列创建的新日期类型列。

val withDateCol = data
.withColumn("date_col", from_unixtime(col("timestamp"), "YYYYMMddHH"))

在此之后,您可以将年、月、日和小时列添加到 DF,然后按这些新列进行分区以进行写入。

withDateCol
.withColumn("year", year(col("date_col")))
.withColumn("month", month(col("date_col")))
.withColumn("day", dayofmonth(col("date_col")))
.withColumn("hour", hour(col("date_col")))
.drop("date_col")
.partitionBy("year", "month", "day", "hour")
.format("orc")
.save("mypath") 

partitionBy 子句中包含的列不会成为文件架构的一部分。


推荐阅读