如何使用 Scala 使用比较器对 DataFrame 进行排序?

2023-12-01

我想使用我自己的比较器根据列对 DataFrame 进行排序。 Spark SQL 可以做到这一点吗?

例如,假设我有一个 DataFrame 注册为表“MyTable”,其中列“Day”,其类型为“string”:

id  | Day  
--------------------
1   | Fri           
2   | Mon           
3   | Sat           
4   | Sun           
5   | Thu           

我想执行这个查询:

SELECT * FROM MyTable ORDER BY Day

我想用我自己的比较器订购“日”列。我想过使用UDF,但不知道是否可行。请注意,我真的想在排序/排序操作中使用比较器。我不想将字符串从“日”列转换为“日期时间”或类似的内容。


在SparkSQL中,你没有选择,需要使用orderBy具有一列或多列。对于 RDD,如果您愿意,可以使用自定义的类似 java 的比较器。确实,这是sortBy的方法RDD (参见Spark 2.4的scaladoc):

def sortBy[K](f: (T) ⇒ K, ascending: Boolean = true, numPartitions: Int = this.partitions.length)
    (implicit ord: Ordering[K], ctag: ClassTag[K]): RDD[T] 

这意味着您可以提供Ordering您选择的,这与 java 完全一样Comparator (Ordering实际上继承自Comparator).

为简单起见,假设我想按列“x”的绝对值排序(这可以在没有比较器的情况下完成,但假设我需要使用比较器)。我首先在行上定义比较器:

class RowOrdering extends Ordering[Row] {
    def compare(x : Row, y : Row): Int = x.getAs[Int]("x").abs - y.getAs[Int]("x").abs
}

现在让我们定义数据并对其进行排序:

val df = Seq( (0, 1),(1, 2),(2, 4),(3, 7),(4, 1),(5, -1),(6, -2),
    (7, 5),(8, 5), (9, 0), (10, -9)).toDF("id", "x")
val rdd = df.rdd.sortBy(identity)(new RowOrdering(), scala.reflect.classTag[Row])
val sorted_df = spark.createDataFrame(rdd, df.schema)
sorted_df.show
+---+---+
| id|  x|
+---+---+
|  9|  0|
|  0|  1|
|  4|  1|
|  5| -1|
|  6| -2|
|  1|  2|
|  2|  4|
|  7|  5|
|  8|  5|
|  3|  7|
| 10| -9|
+---+---+

另一种解决方案是定义隐式排序,以便排序时无需提供它。

implicit val ord = new RowOrdering()
df.rdd.sortBy(identity)

最后,请注意df.rdd.sortBy(_.getAs[Int]("x").abs)会达到相同的结果。此外,您可以使用元组排序来执行更复杂的操作,例如按绝对值排序,如果相等,则将正值放在前面:

df.rdd.sortBy(x => (x.getAs[Int]("x").abs, - x.getAs[Int]("x"))) //RDD
df.orderBy(abs($"x"), - $"x") //dataframe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Scala 使用比较器对 DataFrame 进行排序? 的相关文章

随机推荐

  • Java WSDL DHL 类

    我已经从 DHL WSDL 创建了 Java 类https cig dhl de cig wsdls com dpdhl wsdl geschaeftskundenversand api 2 2 geschaeftskundenversan
  • 如何在 PHP 中获取有用的错误消息?

    我经常尝试运行 PHP 脚本 但只是得到一个空白屏幕 无错误信息 只是一个空屏幕 原因可能是一个简单的语法错误 错误的括号 缺少分号 或者函数调用失败 或者完全是其他原因 很难找出哪里出了问题 我最终注释掉了代码 在各处输入 echo 语句
  • 在 OS X 10.9 (Mavericks) 上安装 Java

    我已经安装了JDK on Mac OS X v10 8 山狮 当我升级到Mac OS X v10 9 小牛队 然后跑了java version在终端中 它显示 不存在 Java 运行时 请求安装 然后我在 Mac 上手动安装了 JDK 1
  • CurrentUtcDateTime 不存在 - 实体框架和 MySql

    我在 Entity Framework 4 1 和 MySql Connector Net 6 4 3 中遇到规范函数问题 根据 Microsoft 的说法 所有数据库提供程序都可以从 LINQ 生成的 SQL 中理解规范函数并将其转换为本
  • 让 Linq 对象变得“脏”的最干净的方法是什么?

    我有一个 Linq To SQL 对象obj类型的MyClass我已经通过我的数据上下文加载了 现在我想强制该对象保存 即使没有字段实际更改 以便保存操作可以在幕后触发一些触发器 让我的数据上下文认为最简单的方法是什么obj是脏的 所以调用
  • 为什么标准 R 中值函数比简单的 C++ 替代函数慢得多?

    我对中位数进行了以下实现C 并将其用于R via Rcpp Rcpp export double median2 std vector
  • iphone -- 将 MKMapPoint 距离转换为米

    假设我有一个由四个 CLLocationCooperative2D 点组成的正方形 这些点的单位为经纬度 我想找到该正方形的面积 以米为单位 我将 CLLocationCooperative2D 点转换为 MKMapPoints 然后找到
  • 在Python中打印CSV的所有行只能运行一次

    我编写了一个非常简单的程序 该程序应该读取 CSV 并打印所有行两次 然而 当我运行该程序时 它第一次打印了所有行 第二次则没有打印任何内容 Code import csv csvfile csv reader open
  • JQuery:如何克隆自动完成字段?

    我正在使用 J rn Zaefferer 的 jquery 自动完成插件 当我克隆自动完成字段时 我似乎不知道如何使其工作 它几乎可以工作 因为当我输入文本时 克隆的自动完成字段会显示选项 但我无法选择项目 起初我以为这是一个浏览器兼容性问
  • 需要一种方法将特定数据从 Firebase Realtime DB 提取到 Google Sheets

    我正在尝试使用 AppS 脚本将 Firebase Realtime DB 数据传输到 Google Sheets 中 我需要一种方法来从数据库中提取 ID 部门和姓氏字符串 同时从下面的日志中接收这些字符串 我使用 childByAuto
  • Mac OS X 上的 Java System.getProperty("user.dir")

    我的桌面上有一个 Mac OS X 10 4 上的应用程序包 我的应用程序查找一个名为 resources 的文件夹 其中保存要显示的文件 与可运行的 JAR 保存在同一位置 我知道应用程序包中也有一个名为 Resources 的文件夹 抱
  • 通过意图传递可序列化对象

    这是我第一次尝试寻求解决我的问题的方法 所以请尽量友善 通过简单的搜索 我在这个网站上找到了许多我处理的问题的解决方案 但我想这次我没有运气 我发现没有什么适合我的问题 所以我结束了问一个新问题 我试图通过意图将对象从一个活动传递到另一个活
  • 简单的 MVC 设置/设计?

    我只是想确保我在构建简单的 MVC 应用程序方面朝着正确的方向前进 MODEL interface Reactor NSObject NSNumber temperature NSString lastInspection NSNumber
  • 递归 - 嵌套数组求和

    我正在尝试对嵌套数组求和 1 2 3 4 5 不使用循环 但我不明白到目前为止我所拥有的有什么问题 function sumItems array let sum 0 array forEach item gt if Array isArr
  • Youtube API 检索直播游戏标题

    我正在尝试使用 Youtube Api 检索直播的游戏标题 我目前正在使用 视频 列表api 但它似乎没有返回此信息 它确实给了我一些主题 ID 但它们并不代表特定的游戏 这些信息可以通过API获取吗 谢谢 检查此回复 我认为它满足您的所有
  • Rails 不检测文件更改并且 config.reload_classes_only_on_change 使服务器太慢

    首先我不知道这是否是一个错误 到目前为止 我一直在 Railsdevelopment rb 环境配置中使用此命令 以便该框检测我的文件的更改 config reload classes only on change false 但现在 使用
  • 我如何知道我的 Config.xml 文件是否在 Magento 中工作?

    我已经创建了一个示例模块 但我不确定它是否 module etc config xml文件正在加载 我确信仅此而已就有问题 有没有办法可以确定该文件是否已加载 免费模块列表module 由我构建 会告诉您系统中安装了哪些模块 并会告诉您您的
  • MVC3 ModelBinding 到带有索引间隙的回传集合

    我的模型上有一个对象集合 我使用 EditFor 函数在视图中渲染这些对象 并且我有一个 EditorTemplate 负责实际渲染每个对象 Html EditorFor model gt model MyObjects 这已经运行良好一段
  • Python f.read 未读取正确的字节数

    我的代码应该读取 4 个字节 但有时只读取 3 个字节 f open test sgy r f seek 99716 AAA f read 4 BBB f read 4 CCC f read 4 print len AAA print le
  • 如何使用 Scala 使用比较器对 DataFrame 进行排序?

    我想使用我自己的比较器根据列对 DataFrame 进行排序 Spark SQL 可以做到这一点吗 例如 假设我有一个 DataFrame 注册为表 MyTable 其中列 Day 其类型为 string id Day 1 Fri 2 Mo