使用 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(在 udf 中使用 Seq[String] 而不是 Array[String] 并且问题已解决。
【讨论】:
以上是关于使用 udf 选择数据框的列的主要内容,如果未能解决你的问题,请参考以下文章