scala - 按时间戳写入分区数据
问题描述
我有一些数据,它的时间戳列字段很长并且它的时代标准,我需要使用 spark scala 以 yyyy/mm/dd/hh 等拆分格式保存该数据
data.write.partitionBy("timestamp").format("orc").save("mypath")
这只是按时间戳拆分数据,如下所示
timestamp=1458444061098
timestamp=1458444061198
但我希望它像
└── YYYY
└── MM
└── DD
└── HH
解决方案
您可以为此利用各种 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 子句中包含的列不会成为文件架构的一部分。
推荐阅读
- android - Android融合定位服务崩溃
- php - 如何在 HTML 表单中解析具有多个输入的多个项目的数据?
- xml - 在 XSD 中我想指定一个元素只能有空白内容
- java - 如何确定我的 Java 线程正在等待什么?
- java - 试图让第二个输入进入“outPut2.add” - Java
- rabbitmq - 从 Axon 3.3.5 上的 RabbitMQ 队列读取事件的问题
- javascript - 如何计算网格中随机数的平均值?
- kubernetes - DNS 解析如何在具有多个网络的 Kubernetes 上工作?
- python-3.x - Scrapy 多页
- ruby-on-rails - Rails 5 - 有没有办法记录缓存未命中?