我想将多个列名作为参数传递给数据框。
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版本。
答案 0 :(得分:1)
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")