如何从年月日分区列列表中提取最新/最近的分区

Posted

技术标签:

【中文标题】如何从年月日分区列列表中提取最新/最近的分区【英文标题】:How to extract latest/recent partition from the list of year month day partition columns 【发布时间】:2019-05-27 04:01:40 【问题描述】:

我在 spark sql 中使用了 show partitions,它给了我以下信息:

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
    我需要提取最新的分区 我需要分别设置年、月和日,以便在另一个数据框中将其用作变量。即:
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) 我需要提取最新的分区。

2) 我需要将年、月和日分开,这样我才能在 另一个数据框作为变量。

由于最终目标是获取最新/最近的分区...您可以使用 joda api DateTime 通过使用isAfter 进行排序来获取最新的分区,如下例所示。

spark.sql(s"show Partitions $yourtablename") 之后,您将得到一个数据框collect,因为它的小数据没有问题。

收集数据框分区后,您将获得这样的数组

       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

【讨论】:

嗨有用吗?如果您可以please accept the answer 作为所有者和vote-up

以上是关于如何从年月日分区列列表中提取最新/最近的分区的主要内容,如果未能解决你的问题,请参考以下文章

excel如何从身份证号码中提取出生年月日

出生年月日提取年龄公式是啥?

如何从年月日的总和中提取日期分量乘以iOS中的某个整数?

c++中如何从字符串2015-6-8取出年月日

根据身份证号码提取出生年月,在EXCEL中怎么设函数公式?

如何提取excel单元格中的年月日,时分秒。其中,单元格格式中,数字选项卡的分类为常规。