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

wljmcqd8  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(465)

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

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版本。

r7knjye2

r7knjye21#

这个 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")

相关问题