Вопрос: Как извлечь последний / недавний раздел из списка год-месяц-день
столбцы разделов
1) Мне нужно извлечь последний раздел.
2) Мне нужно указать год, месяц и день отдельно, чтобы я мог использовать их в
другой фрейм данных в качестве переменных.
- Поскольку конечная цель - получить последний / последний раздел ... Вы можете использовать joda api
DateTime
, отсортировав по isAfter
, чтобы получить последний раздел, как показано в примере ниже.
После spark.sql(s"show Partitions $yourtablename")
вы получите фрейм данных collect
, так как с его небольшими данными нет проблем.
как только вы соберете разделы dataframe, вы получите массив, подобный этому
val x = Array(
"year=2019/month=1/day=21",
"year=2019/month=1/day=22",
"year=2019/month=1/day=23",
"year=2019/month=1/day=24",
"year=2019/month=1/day=25",
"year=2019/month=1/day=26",
"year=2019/month=2/day=27"
)
val finalPartitions = listKeys()
import org.joda.time.DateTime
def listKeys(): Seq[Map[String, DateTime]] = {
val keys: Seq[DateTime] = x.map(row => {
println(s" Identified Key: ${row.toString()}")
DateTime.parse(row.replaceAll("/", "")
.replaceAll("year=", "")
.replaceAll("month=", "-")
.replaceAll("day=", "-")
)
})
.toSeq
println(keys)
println(s"Fetched ${keys.size} ")
val myPartitions: Seq[Map[String, DateTime]] = keys.map(key => Map("businessdate" -> key))
myPartitions
}
val mapWithMostRecentBusinessDate = finalPartitions.sortWith(
(a, b) => a("businessdate").isAfter(b("businessdate"))
).head
println(mapWithMostRecentBusinessDate)
val latest: Option[DateTime] = mapWithMostRecentBusinessDate.get("businessdate")
val year = latest.get.getYear();
val month = latest.get.getMonthOfYear();
val day = latest.get.getDayOfMonth();
println("latest year "+ year + " latest month " + month + " latest day " + day)
Окончательный результат: т. Е. Ваша самая последняя дата - 2019-02-27
, теперь на основе этого вы можете оптимизировать запросы к данным улья.
Identified Key: year=2019/month=1/day=22
Identified Key: year=2019/month=1/day=23
Identified Key: year=2019/month=1/day=24
Identified Key: year=2019/month=1/day=25
Identified Key: year=2019/month=1/day=26
Identified Key: year=2019/month=2/day=27
WrappedArray(2019-01-21T00:00:00.000-06:00, 2019-01-22T00:00:00.000-06:00, 2019-01-23T00:00:00.000-06:00, 2019-01-24T00:00:00.000-06:00, 2019-01-25T00:00:00.000-06:00, 2019-01-26T00:00:00.000-06:00, 2019-02-27T00:00:00.000-06:00)
Fetched 7
Map(businessdate -> 2019-02-27T00:00:00.000-06:00)
latest year 2019 latest month 2 latest day 27