【问题标题】:Spark Sql Dataset get index numberSpark Sql Dataset 获取索引号
【发布时间】:2017-08-01 14:19:02
【问题描述】:

如果我有这样的案例类:

Person(name:String = null, rank:Integer = null)

我有一个dataset: Dataset[Person]

假设数据集有 5 个人物对象:

Dataset[  Person(name = "Jack",id = 100, rank = null), 
          Person(name = "Mary",id = 400, rank = null),
          Person(name = "Tom",id = 199, rank = null), 
          Person(name = "Linda", id = 55, rank = null),
          Person(name = "Wendy", id = 30, rank = null)]

在按 id 对数据集进行排序后,我想在 Scala 中填充排名字段。这样数据集就变成了:

Dataset[  Person(name = "Wendy", id = 30, rank = 1), 
          Person(name = "Linda", id = 55, rank = 2),
          Person(name = "Jack", id = 100, rank = 3), 
          Person(name = "Tom", id = 199, rank = 4),
          Person(name = "Mary", id = 400, rank = 5)]

提前致谢!

【问题讨论】:

  • 排名的规则是什么?你能以某种方式订购数据集吗?否则我认为这没有多大意义。
  • 嗨@RaphaelRoth 感谢您的反馈。是的,这将是按字段排序,比方说按 Person.Id 字段排序。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

如果你有一个数据集,你可以使用row_number函数添加排名列

ds.withColumn("rank", row_number().over(Window.orderBy($"id")))

或者也可以用rank函数

ds.withColumn("rank", rank().over(Window.orderBy("id")))

def row_number(): 列

窗口函数:返回一个从 1 开始的序列号 窗口分区。

希望这会有所帮助!

【讨论】:

  • 但这会将数据集转换为数据框吗?我希望排名在 person 对象内
  • 实际上这行得通!我只需要将 Dataframe 转换为 Dataset[Person]。超级棒!
  • 是的,它提供了数据框,您需要转换为 Dataset[Person]。如果这个答案,那么您可以接受作为答案。
猜你喜欢
  • 2017-02-04
  • 2017-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2019-02-04
相关资源
最近更新 更多