从`org.apache.spark.sql.Row`中提取信息

时间:2015-01-20 00:21:50

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

Array[org.apache.spark.sql.Row]返回了sqc.sql(sqlcmd).collect()

Array([10479,6,10], [8975,149,640], ...)

我可以获得个人价值观:

scala> pixels(0)(0)
res34: Any = 10479

但它们是Any,而不是Int

如何将其提取为Int

The most obvious solution无效:

scala> pixels(0).getInt(0)
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Int

PS。我可以pixels(0)(0).toString.toIntpixels(0).getString(0).toInt,但他们感觉不对......

3 个答案:

答案 0 :(得分:11)

使用getInt应该有效。这是一个人为的例子作为概念证明

import org.apache.spark.sql._
sc.parallelize(Array(1,2,3)).map(Row(_)).collect()(0).getInt(0)

此返回1

然而,

sc.parallelize(Array("1","2","3")).map(Row(_)).collect()(0).getInt(0)

失败。因此,它看起来像是以字符串形式出现,您必须手动转换为int。

sc.parallelize(Array("1","2","3")).map(Row(_)).collect()(0).getString(0).toInt

documentation表示getInt

  

以int形式返回第i列的值。如果值不是整数,或者它是null,则此函数将抛出异常。

所以,它似乎不会试图为你施展

答案 1 :(得分:2)

Row class(另请参阅https://spark.apache.org/docs/1.1.0/api/scala/index.html#org.apache.spark.sql.package)包含方法getInt(i: Int)getDouble(i: Int)等。

另请注意,SchemaRDDRDD[Row] 加上 a schema,它会告诉您哪个列具有哪种数据类型。如果您执行.collect(),则只会获得Array[Row]信息。因此,除非您确定数据是什么样的,否则从SchemaRDD获取模式,然后收集行,然后使用正确的类型信息访问每个字段。

答案 2 :(得分:0)

答案是相关的。您不需要使用collect而是需要调用方法getInt getStringgetAs以防数据类型复杂

val popularHashTags = sqlContext.sql("SELECT hashtags, usersMentioned, Url FROM tweets")
var hashTagsList =  popularHashTags.flatMap ( x => x.getAs[Seq[String]](0))