从 `org.apache.spark.sql.Row` 中提取信息
Extract information from a `org.apache.spark.sql.Row`
我有 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.toInt
或pixels(0).getString(0).toInt
,但他们觉得不对...
Row
class (also see https://spark.apache.org/docs/1.1.0/api/scala/index.html#org.apache.spark.sql.package)有方法getInt(i: Int)
、getDouble(i: Int)
等
另请注意,SchemaRDD
是一个 RDD[Row]
加上 一个 schema
,它告诉您哪个列具有哪种数据类型。如果你这样做 .collect()
你只会得到一个 Array[Row]
而 而 没有那个信息。因此,除非您确定您的数据是什么样子,否则从 SchemaRDD
获取模式,然后收集行,然后使用正确的类型信息访问每个字段。
使用 getInt
应该可以。这是一个人为的例子作为概念证明
import org.apache.spark.sql._
sc.parallelize(Array(1,2,3)).map(Row(_)).collect()(0).getInt(0)
这个return1
然而,
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
:
Returns the value of column i as an int. This function will throw an exception if the value is at i is not an integer, or if it is null.
所以,它似乎不会尝试为您投射
答案是相关的。您不需要使用 collect 而是需要调用方法 getInt
getString
和 getAs
以防数据类型复杂
val popularHashTags = sqlContext.sql("SELECT hashtags, usersMentioned, Url FROM tweets")
var hashTagsList = popularHashTags.flatMap ( x => x.getAs[Seq[String]](0))
我有 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.toInt
或pixels(0).getString(0).toInt
,但他们觉得不对...
Row
class (also see https://spark.apache.org/docs/1.1.0/api/scala/index.html#org.apache.spark.sql.package)有方法getInt(i: Int)
、getDouble(i: Int)
等
另请注意,SchemaRDD
是一个 RDD[Row]
加上 一个 schema
,它告诉您哪个列具有哪种数据类型。如果你这样做 .collect()
你只会得到一个 Array[Row]
而 而 没有那个信息。因此,除非您确定您的数据是什么样子,否则从 SchemaRDD
获取模式,然后收集行,然后使用正确的类型信息访问每个字段。
使用 getInt
应该可以。这是一个人为的例子作为概念证明
import org.apache.spark.sql._
sc.parallelize(Array(1,2,3)).map(Row(_)).collect()(0).getInt(0)
这个return1
然而,
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
:
Returns the value of column i as an int. This function will throw an exception if the value is at i is not an integer, or if it is null.
所以,它似乎不会尝试为您投射
答案是相关的。您不需要使用 collect 而是需要调用方法 getInt
getString
和 getAs
以防数据类型复杂
val popularHashTags = sqlContext.sql("SELECT hashtags, usersMentioned, Url FROM tweets")
var hashTagsList = popularHashTags.flatMap ( x => x.getAs[Seq[String]](0))