如何解决使用expr函数无法对相反方向的2列进行排序
我有一个这样的数据框:
rows = [("Ali",[100]),("Barbara",1,[300,250,100]),("Cesar",[350,("Dongmei",[400,("Eli",2,[250]),("Florita",[500,300,("Gatimu",3,100])]
df=spark.createDataFrame(rows,["name","department","score"])
我运行下面显示的命令,但是数据未按降序在“名称”列上排序。我也没有得到任何错误。
df.orderBy(expr('department'),expr('name desc')).show()
这是一个错误吗?
解决方法
如果我们看一下expr(...)
的文档,它用于从sql之类的语义中创建列。 expr
仅支持selectClause only
支持的表达式,因此不能将order by
表达式放在expr
内。
/**
* Parses the expression string into the column that it represents,similar to
* [[Dataset#selectExpr]].
* {{{
* // get the number of words of each length
* df.groupBy(expr("length(word)")).count()
* }}}
*
* @group normal_funcs
*/
def expr(expr: String): Column = { ...
}
关于您在expr('name desc')
中使用的表达式,它将被翻译为
name AS `desc`
这是不正确的。
截至Dataframe#orderBy
-
2.4.5
的2个变体
- 一个人接受字符串列,没有下面的任何排序顺序-
def orderBy(sortCol: String,sortCols: String*): Dataset[T] = sort(sortCol,sortCols : _*)
- 另一个接受列,您可以在其中指定以下排序顺序-
/**
* Returns a new Dataset sorted by the given expressions. For example:
* {{{
* ds.sort($"col1",$"col2".desc)
* }}}
*
* @group typedrel
* @since 2.0.0
*/
@scala.annotation.varargs
def sort(sortExprs: Column*): Dataset[T] = {
尝试使用以下2种优化方式-
// otption-1
df.orderBy($"department",$"name".desc).show(false) // works
// option-2
df.createOrReplaceTempView("df")
spark.sql("select * from df order by department,name desc") // works
.show(false)
,
我真的不知道这是否是一个错误,我更愿意使用dateObject
和col
函数来实现预期的行为:
desc
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。