16

我已经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

最明显的解决方案不起作用:

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

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

4

3 回答 3

14

使用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

文件指出getInt

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

所以,它似乎不会尝试为你投射

于 2015-01-20T04:02:47.430 回答
2

该类(另见https://spark.apache.org/docs/1.1.0/api/scala/index.html#org.apache.spark.sql.package)具有方法RowgetInt(i: Int)getDouble(i: Int)

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

于 2015-01-20T01:52:08.530 回答
0

答案是相关的。您不需要使用 collect 而是需要调用方法getInt getStringgetAs并且如果数据类型很复杂

val popularHashTags = sqlContext.sql("SELECT hashtags, usersMentioned, Url FROM tweets")
var hashTagsList =  popularHashTags.flatMap ( x => x.getAs[Seq[String]](0)) 
于 2015-01-20T04:41:07.400 回答