Во-первых, я бы предостерег вас от чрезмерного разделения.То есть убедитесь, что у вас достаточно данных, чтобы их можно было разделить по часам, иначе вы можете получить множество папок с небольшими файлами.Второе предостережение, которое я хотел бы сделать, это использование иерархии разделов (год / месяц / день / час), поскольку для этого потребуется рекурсивное обнаружение разделов.
Сказав это, если вы определенно хотите разделить на сегменты часа, япредложил бы урезать вашу временную метку до часа в новый столбец и разделить ее.Тогда Spark будет достаточно умен, чтобы распознавать формат как метку времени, когда вы будете читать его обратно, и вы сможете выполнить полную фильтрацию по мере необходимости.
input
.withColumn("ts_trunc", date_trunc("HOUR", 'timestamp)) // date_trunc added in Spark 2.3.0
.write
.partitionBy("ts_trunc")
.save("/mnt/warehouse/part-test")
spark.read.load("/mnt/warehouse/part-test").where("hour(ts_trunc) = 10")
Другой вариант - разделить по дате и часудень как так:
input
.withColumn("date", to_date('timestamp))
.withColumn("hour", hour('timestamp))
.write
.partitionBy("date", "hour")
.save("/mnt/warehouse/part-test")