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

Posted

技术标签:

【中文标题】从 org.apache.spark.sql.Row 中提取信息【英文标题】:Extract information from a `org.apache.spark.sql.Row` 【发布时间】:2015-01-20 00:21:49 【问题描述】:

我有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,但他们觉得不对...

【问题讨论】:

【参考方案1】:

使用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 列的值。如果 i 处的值不是整数,或者为 null,此函数将抛出异常。

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

【讨论】:

【参考方案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] schema,它告诉您哪个列具有哪种数据类型。如果您使用.collect(),您只会得到一个Array[Row]没有 有该信息。因此,除非您确定自己的数据是什么样的,否则请从 SchemaRDD 获取架构,然后收集行,然后使用正确的类型信息访问每个字段。

【讨论】:

好吧,我猜是因为它是一个字符串?我不知道您的数据来自哪里,但是如果您查看架构,它应该表明第一列是字符串类型。 注意:在 Spark 1.3 中,SchemaRDD 被称为 DataFrame。【参考方案3】:

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

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

【讨论】:

以上是关于从 org.apache.spark.sql.Row 中提取信息的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFMVVMViewModel?

在 python 中,为啥从数组读取比从列表读取慢?

从图库中挑选或从相机捕获的高质量图像

从PRISM开始学WPFMVVMCommand?

从PRISM开始学WPFPrism?

mysql 主-主-从-从