Apache Spark 如何过滤一个 Dataframe 的范围有分区为年,月,日和小时?

dohp0rv5  于 2023-03-03  发布在  Apache
关注(0)|答案(1)|浏览(160)

我必须从一个分区如下的表中读取 Dataframe -年、月、日和小时。
输入:
| 年份|月|日期|小时|
| - ------|- ------|- ------|- ------|
| 二○二三|十二|三十一|十八|
| 小行星2024|1个|1个|十个|
| 二○二三|十二|三十一|十四|
| 小行星2024|1个|1个|十四|
需要根据我的审计范围-开始和结束时间戳从表中过滤一个分区范围。
开始时间戳:2023年12月31日15:00:00(含)结束时间戳:2024年1月1日14:00:00(独家)
预期输出:
| 年份|月|日期|小时|
| - ------|- ------|- ------|- ------|
| 二○二三|十二|三十一|十八|
| 小行星2024|1个|1个|十个|
尝试如下:
尝试1:

val filteredDf = rawDF.where(($"year" >= startTimeLocal.getYear && $"month" >= startTimeLocal.getMonthValue && $"day" >= startTimeLocal.getDayOfMonth && $"hour" >= startTimeLocal.getHour) && ($"year" <= endTimeLocal.getYear && $"month" <= endTimeLocal.getMonthValue && $"day" <= endTimeLocal.getDayOfMonth && $"hour" < endTimeLocal.getHour))

此条件失败,因为将跳过第31天大于14的小时值。
尝试2:

val yearDf = rawDF.where($"year" >= startTimeLocal.getYear && $"year" <= endTimeLocal.getYear)
val monthDf = yearDf.where(($"year" === startTimeLocal.getYear && $"month" >= startTimeLocal.getMonthValue) || ($"year" === endTimeLocal.getYear && $"month" <= endTimeLocal.getMonthValue))
val dayDf = monthDf.where(($"day" >= startTimeLocal.getDayOfMonth && $"hour" >= startTimeLocal.getHour) || ($"day" <= endTimeLocal.getDayOfMonth && $"hour" < endTimeLocal.getHour))

尝试3:

val final4Df = rawDF.where(($"year" >= startTimeLocal.getYear && $"day" >= startTimeLocal.getDayOfMonth && $"hour" >= startTimeLocal.getHour && $"day" >= startTimeLocal.getDayOfMonth) || ($"year" <= endTimeLocal.getYear && $"month" <= endTimeLocal.getMonthValue && $"day" <= endTimeLocal.getDayOfMonth && $"hour" < endTimeLocal.getHour))
sr4lhrrt

sr4lhrrt1#

我认为您可以从包括年初和年末之间的所有数据开始,然后在粒度级别上进行筛选

val startYear = startTimeLocal.getYear
val startMonth = startTimeLocal.getMonthValue
val startDay = startTimeLocal.getDayOfMonth
val startHour = startTimeLocal.getHour

val endYear = endTimeLocal.getYear
val endMonth = endTimeLocal.getMonthValue
val endDay = endTimeLocal.getDayOfMonth
val endHour = endTimeLocal.getHour

val filteredDf = rawDF.where(
    ($"year" >= startDay && $"year" <= endYear)
    && !(
        ($"year" === startYear && $"month" < startMonth) // All months before start date
        || ($"year" === startYear && $"month" === startMonth && $"day" < startDay) // All days before start day
        || ($"year" === startYear && $"month" === startMonth && $"day" === startDay && $"hour" < startHour) // All hours before start hour
        || ($"year" === endYear && $"month" > endMonth) // All months after end date
        || ($"year" === endYear && $"month" === endMonth && $"day" > endDay) // All days after end day
        || ($"year" === endYear && $"month" === endMonth && $"day" === endDay && $"hour" >= endHour) // All hours after end hour
    )
)

相关问题