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 : _*)