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