如何为数据框中的复杂列创建包含数组(案例类)的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 数据集中的枚举列编写案例类?

如何为熊猫数据框中的每一行映射/替换列中的多个值

如何为scala中的空数据框现有列添加赋值?

如何为列表框中的每个项目设置不同的工具提示文本?

如果子字符串列表中的任何值包含在数据框中的任何列中,则过滤行

PySpark:如何为数组列中的每个元素添加值?