scala - 如何使用火花数据框列来查找数组
问题描述
我有一个场景,例如下面包含的内容,我需要查找每个 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("") 导致 "".. 如果您有任何建议或想法,请告诉我..
解决方案
推荐阅读
- c# - 使用 LINQ 的 xml 中特定属性值的列表
- c# - 如何在所有请求之间创建共享对象?
- react-native - 有没有办法找出pubg Mobile特定页面的深层链接
- .htaccess - .htaccess 仅在不访问子目录时重定向
- go - 启动 Go Web 服务器时 Windows 防火墙总是提示
- swift - 迅速。结合。重试时有没有办法多次调用发布者块?
- algorithm - 与完整性相关的问题:P = PC 吗?
- ansible - 如何将 Ansible Inventory 名称作为变量导出到服务器
- flutter - Flutter - 正确导入的包上的未定义名称
- angular - 无法在本地 Angular 项目上运行 npm install