如何为数据框中的复杂列创建包含Array(case类)的udf

时间:2017-04-04 07:53:51

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个数据框,其复杂的列数据类型为Arraytype>。为了转换这个数据帧,我创建了udf,它可以使用Array [case class]作为参数来使用这个列。这里的主要瓶颈是当我根据stucttype创建case类时,structfield名称包含特殊字符,例如“## field”。所以我像case类(##field)一样为case类提供相同的名称,并将其附加到udf参数。在spark udf定义中解释后,将case类字段的名称更改为此“$ hash $ hashfield”。使用此数据帧执行转换时,由于此未命中匹配而失败。请帮忙......

1 个答案:

答案 0 :(得分:1)

由于JVM限制,Scala以编码形式存储标识符,目前Spark无法将##field映射到$hash$hashfield

一种可能的解决方案是从原始行手动提取字段(但您需要知道df中字段的顺序,您可以使用df.schema):

val myUdf = udf { (struct: Row) =>
  // Pattern match struct:
  struct match {
    case Row(a: String) => Foo(a)
  }

  // .. or extract values from Row
  val `##a` = struct.getAs[String](0)
}