如何将DataFrame行转换为List / Map

时间:2018-04-23 20:46:50

标签: scala apache-spark dataframe apache-spark-sql

我有以下DataFrame df

id  | type  | count
-------------------
1   | A     | 2 
2   | B     | 4 

我想传递此df的每一行作为函数saveObj的输入。

df.foreach( row => {
  val list = List("id" -> row.get(0),"type" -> row.get(1))
  saveObj(list)
})

saveObj内,我想访问list值,如下所示:list("id")list("type")

如何避免使用列索引?:row.get(0)row.get(1)

1 个答案:

答案 0 :(得分:2)

您可以使用需要列名的getAs。首先创建一个您感兴趣的列名列表 - 您可以将它们映射到所需的元组列表:

// can also use df.columns.toList to get ALL columns
val columns = List("id", "type") 

df.foreach(row => {
  saveObj(columns.map(name => name -> row.getAs[Any](name)))
})

或者,您可以通过使用模式匹配来利用Row.apply - 但在这种情况下仍需要知道Row中列的顺序并重复列名称:

df.foreach(_ match {
  case Row(id: Any, typ: Any, _) => saveObj(List("id" -> id, "type" -> typ))
})