如何为数据框中的复杂列创建包含数组(案例类)的udf
Posted
技术标签:
【中文标题】如何为数据框中的复杂列创建包含数组(案例类)的udf【英文标题】:How to create udf containing Array (case class) for complex column in a dataframe 【发布时间】:2017-04-04 07:53:50 【问题描述】:我有一个具有复杂列数据类型 Arraytype> 的数据框。为了转换这个数据框,我创建了 udf,它可以使用 Array [case class] 作为参数来使用这个列。这里的主要瓶颈是当我根据结构类型创建案例类时,结构字段名称包含特殊字符,例如“##field”。所以我为案例类提供相同的名称,就像这种方式案例类(##field
)并将其附加到 udf 参数。在 spark udf 定义中解释后,将案例类字段的名称更改为此“$hash$hashfield”。使用此数据帧执行转换时,由于此未匹配而失败。请帮忙...
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于如何为数据框中的复杂列创建包含数组(案例类)的udf的主要内容,如果未能解决你的问题,请参考以下文章
如何为 Apache Spark 数据集中的枚举列编写案例类?