Pyspark 使用expr函数无法按相反方向对2列进行排序

Pyspark 使用expr函数无法按相反方向对2列进行排序,pyspark,Pyspark,我有这样一个数据帧: rows = [("Ali", 0, [100]),("Barbara", 1, [300, 250, 100]),("Cesar", 1, [350, 100]),("Dongmei", 1, [400, 100]), ("Eli", 2, [250]),("Florita", 2, [500, 300, 100]),("Gatimu"

我有这样一个数据帧:

rows = [("Ali", 0, [100]),("Barbara", 1, [300, 250, 100]),("Cesar", 1, [350, 100]),("Dongmei", 1, [400, 100]), ("Eli", 2, [250]),("Florita", 2, [500, 300, 100]),("Gatimu", 3, [300, 100])] 

df=spark.createDataFrame(rows,["name", "department", "score"])
我运行如下所示的命令,但数据不会按名称列降序排序。我也没有得到任何错误

df.orderBy(expr('department'),expr('name desc')).show()

这是一个bug吗?

我真的不知道这是否是一个bug,personnalyl我宁愿使用col和desc函数,它将与预期的行为一起工作:


从pyspark.sql.functions导入col 行=[ 阿里,0,[100], 芭芭拉,1,[300250100], 塞萨尔,1,[350100], 东美,1,(400,100),, 以利,2,[250], 弗洛里塔,2,[500300100], 加蒂姆,3,[300100] ] df=spark.createDataFramerows[姓名、部门、分数] df.orderBycoldepartment,colname.desc.show
如果我们看一下expr…的文档,它被用来创建一个类似sql语义的列。expr只支持SELECTCLASSION only支持的表达式,因此您不能在expr中按表达式排序

/** *将表达式字符串解析为它所表示的列,类似于 *[[DatasetselectExpr]]。 * {{{ *//获取每种长度的字数 *df.groupbyexpllengword.count * }}} * *@群正规函数 */ def exprexpr:字符串:列={。。。 } 关于您在orderBy expr'name desc'中使用的表达式,它将被翻译为

name AS `desc`
这是不正确的

从2.4.5开始,DataframeorderBy有两种变体-

一种是不带任何排序顺序的字符串列,如下所示- 另一个接受列,您可以在其中指定排序顺序,如下所示- /** *返回按给定表达式排序的新数据集。例如: * {{{ *ds.sort$col1,$col2.desc * }}} * *@group-typedrel *@自2.0.0以来 */ @scala.annotation.varargs def SORTSORTSORTEXPORS:列*:数据集[T]={ 尝试使用以下两个选项-

//选项-1 df.orderBy$department、$name.desc.showfalse//works //备选方案2 df.createOrReplaceTempViewdf spark.sqlselect*按部门从df订单中选择,名称desc//works .showfalse
从pyspark.sql.functions import desc,asc df.orderByexprcount desc.show2-这些行来自第85页的Spark权威指南。请在github上提出一个错误,然后引用这个stackoverflow查询您是对的,但是Spark definitive指南中有一个示例,它给出了使用expr的orderBy示例。我刚刚扩展了这个示例将le转换为多个排序方向相反的列,但它不起作用。为什么?
def orderBy(sortCol: String, sortCols: String*): Dataset[T] = sort(sortCol, sortCols : _*)