首页 > 解决方案 > 更改 Rw Spark scala 的 getValuesMap

问题描述

我正在与 ForeachWriter[Row] 一起实现自定义火花接收器。

对于流程函数,我想将字段的值作为 int 获取。因此,如果我假设val row = Row("city","name","age")我想将年龄作为 Int 并将其余字段作为字符串。

def process(row: Row) = {

    val fieldNames = row.schema.fieldNames
    val rowAsMap = row.getValuesMap(fieldNames)

使用 getValuesMap 每个字段都被解析为一个字符串。

我考虑过模式匹配来改变 getValuesMap 函数:

val rowAsMap =  fieldNames.map {
      case "age" => row.getAs[Int]("age")
      case _ => row.getAs[String]

    }.toMap

这不起作用,因为它的年龄总是写为接收器中的字符串,任何帮助/想法,以从 Row 获取预期类型的​​值

标签: scalaapache-sparkpattern-matching

解决方案


我不知道你为什么要把那种类型转换逻辑放在里面ForEachWriter[Row]。如果您希望 age 对其Int调用者负责,请将age内部 Row 的模式转换为Int,不是吗?

另外,我认为没有必要这样做-

val rowAsMap =  fieldNames.map {
      case "age" => row.getAs[Int]("age")
      case _ => row.getAs[String]

    }.toMap

row.getValuesMap(fieldNames)做同样的事情。请检查getValuesAsMap 的源代码


推荐阅读