将行转换为spark scala中的map

Sor*_*los 6 scala apache-spark apache-spark-sql

我有一个数据框的行,我想将它转换为Map [String,Any],它将列名映射到该列的行中的值.

有一个简单的方法吗?

我是为字符串值做的

def rowToMap(row:Row): Map[String, String] = {
row.schema.fieldNames.map(field => field -> row.getAs[String](field)).toMap
}

val myRowMap = rowToMap(myRow)
Run Code Online (Sandbox Code Playgroud)

如果该行包含其他值,而不是像String这样的特定值,则代码变得更加混乱,因为该行没有方法 .get(field)

有任何想法吗?

Psi*_*dom 10

你可以使用getValuesMap:

val df = Seq((1, 2.0, "a")).toDF("A", "B", "C")    
val row = df.first
Run Code Online (Sandbox Code Playgroud)

得到Map[String, Any]:

row.getValuesMap[Any](row.schema.fieldNames)
// res19: Map[String,Any] = Map(A -> 1, B -> 2.0, C -> a)
Run Code Online (Sandbox Code Playgroud)

或者你可以得到Map[String, AnyVal]这个简单的情况,因为值不是复杂的对象

row.getValuesMap[AnyVal](row.schema.fieldNames)
// res20: Map[String,AnyVal] = Map(A -> 1, B -> 2.0, C -> a)
Run Code Online (Sandbox Code Playgroud)

注意:返回的值类型getValuesMap可以标记为任何类型,因此您不能依赖它来确定您拥有的数据类型,而是需要记住您从一开始就拥有的内容.