首页 > 解决方案 > 如何使用火花数据框列来查找数组

问题描述

我有一个场景,例如下面包含的内容,我需要查找每个 id 值的序列,如果找到匹配项,我需要获取相应的名称并填充数据框中的 Name 列(我故意保留这样可以避免加入)..场景

在此处输入图像描述

我能够创建一个通用方法来完成这项工作,但是这个实现的问题是如果数组太大它会炸毁数据节点堆空间..

v1:不缩放

def colTransform(refCol: String,newCol: String,lookUpArray: Array[Seq[Any]],index: Int)(df: DataFrame): DataFrame = {
    df.withColumn(newCol,
       concat_ws("",array(
                lookUpArray.map{c =>
                           when(col(refCol).contains(c(0)), c(index).toString).otherwise(lit(""))
                            }: _*
                )
            )
        )
 }

第二个版本更简单,但有一个微妙的问题

def colTransform(
refCol: String,newCol: String,lookUpArray: Array[Seq[Any]],index: Int)(df: DataFrame): DataFrame = {
    df.withColumn(newCol,
        lit(s"${lookUpArray.filter{c =>
                    df(refCol) == lit(c(0))
                    }.map{c => if (c.length == 0) "Unknown" else c(index)}.mkString("")}")
        )
}

问题是,应用于lookUpArray(第3行)的过滤器方法需要一个布尔值..所以我提供df(refCol)== lit(c(0))..但这总是会评估为false,因为类型左边是Column,右边是String。它编译并运行,但最终结果是一个空列(因为所有内容都被过滤掉了,然后空 Seq 上的 mkString("") 导致 "".. 如果您有任何建议或想法,请告诉我..

标签: scalaapache-spark

解决方案


推荐阅读