是否有一个Spark内置组件可以平整嵌套数组?

时间:2019-01-19 20:51:04

标签: scala apache-spark apache-spark-sql user-defined-functions

我有一个Seq[Seq[String]]的DataFrame字段,我构建了一个UDF来将所述列转换为Seq [String]的列;基本上是Scala的flatten函数的UDF。

def combineSentences(inCol: String, outCol: String): DataFrame => DataFrame = {

    def flatfunc(seqOfSeq: Seq[Seq[String]]): Seq[String] = seqOfSeq match {
        case null => Seq.empty[String]
        case _ => seqOfSeq.flatten
    }
    df: DataFrame => df.withColumn(outCol, udf(flatfunc _).apply(col(inCol)))
}

我的用例是字符串,但是显然,这可能是通用的。您可以在一系列DataFrame转换中使用此功能,例如:

df.transform(combineSentences(inCol, outCol))

Spark内置功能是否具有相同功能?我一直找不到。

1 个答案:

答案 0 :(得分:4)

有一个类似的功能(自Spark 2.4起),它被称为flatten

import org.apache.spark.sql.functions.flatten

来自the official documentation

  

def flatten(e: Column): Column

     

从数组数组创建单个数组。如果嵌套数组的结构深于两层,则仅除去一层嵌套。

     

因为

     

2.4.0

要获得确切的等效值,您必须coalesce来替换NULL