【问题标题】:Spark DataFrame instance a new columnSpark DataFrame 实例新列
【发布时间】:2016-12-13 21:55:12
【问题描述】:

我有一个数据框,我在我的第一个 Column 上进行 groupByKey 有一个字符串数组,我想在我的数据框的新列中实例化一个新对象。

+-----------+-----------------------------------------------------------+
|name       |Thing                                                      |
+-----------+-----------------------------------------------------------+
|253        |[a, b, c, d, e]                                            |
|095        |[f, g]                                                     |
|282        |[h, i, j]                                                  |
+-----------+-----------------------------------------------------------+

我要实例化的对象具有这种结构:

public MyObject(String name,
               String[] Thing)

我定义了一个案例类来使用 DataFrame :

 case class Myclass(name: String, Thing: Array[String])

为了实现这个目标,我使用了 UDF 函数:

  def myFunction(name : String, Thing: Array[String]): MyObject= {
  return new MyObject(name , Thing)
}

我的代码是这样的:

var my_df = my_old_df.map(line=>(line(0).asInstanceOf[String],line(1).asInstanceOf[String]))
  .groupByKey()

val my_next_df : DataFrame= my_df.map(line => Myclass(line._1.toString,line._2.toArray)).toDF()

val myudf= sqlContext.udf.register("myudf", myFunction _)

val my_df_problem  = my_next_df.withColumn("Object", myudf($"name", $"Thing"))

我有实例化问题:java.lang.UnsupportedOperationException: 不支持类型 Library.class 的架构

【问题讨论】:

  • 你的UDF不应该是... : MyClass而不是... : MyObject吗?无论如何,在您拥有的第二行代码之后就完成了。你根本不需要第 3 行和第 4 行。

标签: scala apache-spark spark-dataframe


【解决方案1】:

似乎UDF必须返回MyClass类型。

val myudf= sqlContext.udf
      .register("myudf", (name : String, thing: Array[String]) => new MyClass(name , thing))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多