使用 udf 选择数据框的列

Posted

技术标签:

【中文标题】使用 udf 选择数据框的列【英文标题】:select column of a dataframe using udf 【发布时间】:2019-05-31 22:34:03 【问题描述】:

我使用 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>)

【问题讨论】:

错误后是否有堆栈跟踪? 作业因阶段失败而中止:阶段 20.0 中的任务 0 失败 4 次,最近一次失败:阶段 20.0 中丢失任务 0.3(TID 56,... .com,执行程序 15):org. apache.spark.SparkException:执行失败.... 原因:java.lang.ClassCastException:scala.collection.mutable.WrappedArray$ofRef 无法转换为 [Ljava.lang.String;在 $anonfun$1.apply(:24) 【参考方案1】:

在 udf 中使用 Seq[String] 而不是 Array[String] 并且问题已解决。

【讨论】:

以上是关于使用 udf 选择数据框的列的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 中的 UDF 能否返回与列不同的对象?

Pyspark:访问 UDF 中行内的列

如何选择 sparkR 数据框的列值?

如何在python中使用正则表达式在字符串之间选择值并放置在数据框的列中

将不同的函数应用于按名称选择函数的数据框的列

pyspark:数据框在另一个数据框的列中按ID选择行