Apache spark 如何将多个列作为参数传递给Spark dataframe

Apache spark 如何将多个列作为参数传递给Spark dataframe,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我想将多个列名作为参数传递给dataframe val readData=spark.sqlContext .read.format(“csv”) .选项(“分隔符“,”,”) .schema(schema) .load(“emp.csv”) val cols_list1=“emp_id,emp_dt” val cols_list2=“emp_num” val RemoveDupli_DF=读取数据 .withColumn(“rnk”,row_number()。在(Window.partitio

我想将多个列名作为参数传递给dataframe

val readData=spark.sqlContext
.read.format(“csv”)
.选项(“分隔符“,”,”)
.schema(schema)
.load(“emp.csv”)
val cols_list1=“emp_id,emp_dt”
val cols_list2=“emp_num”
val RemoveDupli_DF=读取数据
.withColumn(“rnk”,row_number()。在(Window.partitionBy(s“$cols_list1”)。orderBy(s“$cols_list2”))
如果我有一个列名,上面的代码是有效的,而对于两个或更多的列,下面给出的代码是错误的

线程“main”org.apache.spark.sql.AnalysisException中的异常:无法解析“
emp\u id,emp\u dt


使用Scala 2.x版本。

partitionBy
方法作为多个签名:

def partitionBy(colName:String,colNames:String*)
//或
def分区依据(列:列*)
您的代码将列列表作为单个字符串提供,该字符串将失败,因为没有名为
emp\u id,emp\u dt的列。因此,您会收到错误消息

可以在集合中定义列名(作为字符串)

val cols_seq1=Seq(“emp_id”、“emp_dt”)
然后像这样称呼partitions:

Window.partitionBy(列顺序1:*)
符号
:*
告诉编译器将
cols\u seq1
的每个元素作为自己的参数传递到
partitionBy
调用中,而不是将其全部作为单个参数传递

作为替代方案,您也可以使用

Window.partitionBy(“emp\u id”、“emp\u dt”)

感谢迈克的回复。我得到了类似的问题,根据上述输入,我尝试如下。val cols_list1=Seq(col(“emp_id”),col(“emp_dt”))val checkDupli=readData.withColumn(“rnk”,row_number().over(Window.partitionBy(s“$cols_list1”).orderBy(s“$cols_list2”))线程“main”org.apache.spark.sql.AnalysisException:无法解析“
列表(emp_id,emp_dt)
'给定的输入列:注意:emp_id和emp_dt列是我的数据框readData的一部分不确定,这里出了什么问题。如果还有其他有效的解决方案,我将不胜感激。我认为要让spark扩展您的列表,我需要使用
cols\u seq1:\u*