如何将多个列作为参数传递给Spark数据框

问题描述

我想将多个列名作为参数传递给数据框。

val readData = spark.sqlContext
  .read.format("csv")
  .option("delimiter",",")
  .schema(Schema)
  .load("emp.csv")

val cols_list1 = "emp_id,emp_dt"
val cols_list2 = "emp_num"

val RemoveDupli_DF = 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

使用Scala 2.x版本。

解决方法

partitionBy方法为多个签名:

def partitionBy(colName: String,colNames: String*)
// or
def partitionBy(cols: Column*)

您的代码将列列表作为单个字符串提供,这将失败,因为没有名为emp_id,emp_dt的列。因此,您会收到错误消息。

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

val cols_seq1 = Seq("emp_id","emp_dt")

然后调用分区,如下所示:

Window.partitionBy(cols_seq1: _*)

符号: _*告诉编译器将cols_seq1的每个元素作为自己的参数传递给partitionBy调用,而不是将所有元素作为一个参数传递。

您也可以只使用

Window.partitionBy("emp_id","emp_dt")

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...