使用udf选择数据框的列

时间:2019-05-31 22:34:03

标签: scala dataframe select user-defined-functions

我使用spark-shell,并希望使用select和udf从另一个数据帧(df1)创建一个数据帧(df2)。但是当我想显示df2 ==> df2.show(1)

时出现错误
  var df1 = sql(s"select * from table_1")
  val slice = udf ((items: Array[String]) => if (items == null) items 
  else {
     if (items.size <= 20)
       items
     else
       items.slice(0, 20)
  })
  var df2 = df1.select($"col1", slice($"col2"))

和df1模式是:

scala> df1.printSchema
root
  |-- col1: string (nullable = true)
  |-- col2: array (nullable = true)
  |    |-- element: string (containsNull = true)

 scala> df2.printSchema
 root
   |-- col1: string (nullable = true)
   |-- UDF(col2): array (nullable = true)
   |    |-- element: string (containsNull = true)

错误:

 Failed to execute user defined function($anonfun$1: (array<string>) => array<string>)

1 个答案:

答案 0 :(得分:1)

使用udf中的Seq [String]而不是Array [String],问题已解决。