Apache Spark:按名称获取Row的元素

时间:2015-06-05 19:30:19

标签: scala apache-spark schema dataframe

在Apache Spark中的DataFrame对象中(我正在使用Scala接口),如果我正在迭代其Row个对象,有没有办法按名称提取值?我可以看到如何做一些非常尴尬的事情:

def foo(r: Row) = {
  val ix = (0 until r.schema.length).map( i => r.schema(i).name -> i).toMap
  val field1 = r.getString(ix("field1"))
  val field2 = r.getLong(ix("field2"))
  ...
}
dataframe.map(foo)

我认为必须有更好的方法 - 这非常冗长,它需要创建这个额外的结构,并且还需要明确地知道类型,如果不正确,将产生运行时异常而不是编译时错误。

2 个答案:

答案 0 :(得分:19)

您可以使用getAs

中的“org.apache.spark.sql.Row
r.getAs("field1")
r.getAs("field2")

了解getAs(java.lang.String fieldName)

的更多信息

答案 1 :(得分:4)

目前Scala API不支持此功能。您最近的是this JIRA titled "Support converting DataFrames to typed RDDs"