首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从年、月、日分区列列表中提取最新/最近的分区

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

Stack Overflow用户
提问于 2019-05-27 12:01:41
回答 1查看 809关注 0票数 -1

我在spark sql中使用了show partitions,它为我提供了以下内容:

代码语言:javascript
复制
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. ,我需要分别到年,月和日,这样我就可以在另一个数据帧中使用它作为变量。即:

代码语言:javascript
复制
part_year=2019
part_month=1
part_day=29 

我已经使用了:

代码语言:javascript
复制
val overwrite2 = overwrite.select(col("partition",8,8) as year

我从中得到了

代码语言:javascript
复制
2019/month

为了删除它,我使用了另一个dataframe,其中我使用regex_replace将month替换为空,这样就创建了另一个dataframe。

这反过来又产生了大量的开销。我想要的是所有这些步骤都在一个数据帧中完成,这样我就可以得到结果数据帧如下:

代码语言:javascript
复制
part_year=2019
part_month=2
part_day=27

其中最新的分区被拾取。

EN

回答 1

Stack Overflow用户

发布于 2019-05-27 15:38:12

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

1)我需要提取最新的分区。

2)我需要将年、月和日分开,这样我就可以在另一个数据帧中使用它作为变量。

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

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

收集数据帧分区后,您将获得如下所示的数组

代码语言:javascript
复制
       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,基于此,您可以以优化的方式查询配置单元数据。

代码语言:javascript
复制
 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56319532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档