首页 > 解决方案 > Spark dataframe orderby在scala中使用许多列

问题描述

在 Spark 1.6 中,基本上我想应用分区,然后使用两列进行排序,以便我可以为每个分区应用排名逻辑

 val str = "insertdatetime,a_load_dt"
val orderByList = str.split(",")
val ptr = "memberidnum"
val partitionsColumnsList = ptr.split(",").toList


val  landingDF = hc.sql("""select memberidnum,insertdatetime,'2019-09-26' as a_load_dt from landing_omega.omegamaster""")
val  stagingDF = hc.sql("""select memberidnum,insertdatetime,a_load_dt from staging_omega.omegamaster where recordstatus ='current'""")
val unionedDF = landingDF.unionAll(stagingDF)
unionedDF.registerTempTable("temp_table")
val windowFunction = Window.partitionBy(partitionsColumnsList.map(elem => col(elem)):_*).orderBy(unionedDF(orderByList(0),orderByList(1)).desc)

但它会引发以下错误

 scala> val windowFunction = Window.partitionBy(partitionsColumnsList.map(elem => col(elem)):_*).orderBy(unionedDF(orderByList(0),orderByList(1)).desc)
<console>:56: error: too many arguments for method apply: (colName: String)org.apache.spark.sql.Column in class DataFrame
     val windowFunction = Window.partitionBy(partitionsColumnsList.map(elem => col(elem)):_*).orderBy(unionedDF(orderByList(0),orderByList(1)).desc)

我该如何解决这个问题。我想在两列 desc order 上应用 order by

请帮忙^

标签: scalaapache-spark

解决方案


您可以使用以下代码段:

import org.apache.spark.sql.functions.col
import org.apache.spark.sql.expressions.Window

Window.partitionBy(partitionsColumnsList.map(col): _*)
.orderBy(array_union(orderByList.map(col): _*).desc)

如果这不起作用。请告诉我。


推荐阅读