Как извлечь последний / недавний раздел из списка столбцов разделов день-месяц-день - PullRequest
0 голосов
/ 27 мая 2019

Я использовал show partitions в spark sql, что дает мне следующее:

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
  1. Мне нужно извлечь последний раздел
  2. Мне нужно год, месяц и деньотдельно, поэтому я могу использовать его в другом кадре данных в качестве переменных.Т.е.:
part_year=2019
part_month=1
part_day=29 

Я использовал:

val overwrite2 = overwrite.select(col("partition",8,8) as year

, из которого я получаю

2019/month

Для удаления этого я использую другой фрейм данных, где я используюregex_replace чтобы заменить месяц пустым, чтобы был создан другой фрейм данных.

Это, в свою очередь, создает много накладных расходов.Я хочу, чтобы все эти шаги выполнялись в одном фрейме данных, чтобы я мог получить результирующий фрейм данных в виде:

part_year=2019
part_month=2
part_day=27

с последним выбранным разделом.

1 Ответ

1 голос
/ 27 мая 2019

Вопрос: Как извлечь последний / недавний раздел из списка год-месяц-день столбцы разделов

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...