首页 > 解决方案 > 从数据集中的地图按键排序

问题描述

我想按时间戳订购从 HDFS 检索的一些 avro 文件。

我的 avro 文件的架构是:

标题:地图[字符串,字符串],正文:字符串

现在棘手的部分是时间戳地图中的键/值之一。所以我在地图中包含了这样的时间戳:

key_1 -> value_1,key_2 -> value_2,时间戳 -> 1234567,key_n -> value_n

请注意,值的类型是字符串。

我创建了一个案例类来使用此架构创建我的数据集:

case class Root(headers : Map[String,String], body: String)

创建我的数据集:

val ds = spark
          .read
          .format("com.databricks.spark.avro")
          .load(pathToHDFS)
          .as[Root]

我真的不知道如何从这个问题开始,因为我只能获取列标题和正文。如何让嵌套值最终按时间戳排序?

我想做这样的事情:

ds.select("headers").doSomethingToGetTheMapStructure.doSomeConversionStringToTimeStampForTheColumnTimeStamp("timestamp").orderBy("timestamp")

有点精确:我不想从我的初始数据集中丢失任何数据,只是一个排序操作。

我使用 Spark 2.3.0。

标签: scalaapache-sparkapache-spark-dataset

解决方案


您可以使用 Scala 的 sortBy,它带有一个函数。我建议您将 val ds 明确声明为 Vector(或其他集合),这样您将在 IntelliJ 中看到适用的函数(如果您使用的是 IntelliJ)并且它肯定会编译。

根据您的代码,请参阅下面的示例:

  case class Root(headers : Map[String,String], body: String)

  val ds: Vector[Root] = spark
    .read
    .format("com.databricks.spark.avro")
    .load(pathToHDFS)
    .as[Root]

  val sorted = ds.sortBy(r => r.headers.get("timestamp").map(PROCESSING) ).reverse

编辑:添加反向(假设您希望它降序)。在作为参数传递的函数内部,您还将处理时间戳。


推荐阅读