Scala 从“org.apache.spark.sql.Row”中提取信息`
我有Scala 从“org.apache.spark.sql.Row”中提取信息`,scala,apache-spark,apache-spark-sql,Scala,Apache Spark,Apache Spark Sql,我有sqc.sql(sqlcmd.collect()返回的Array[org.apache.spark.sql.Row]: 我可以得到各个值: 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.l
sqc.sql(sqlcmd.collect()
返回的Array[org.apache.spark.sql.Row]
:
我可以得到各个值:
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
另外,我可以做pixels(0)(0).toString.toInt
或pixels(0).getString(0).toInt
,但他们感觉不对…这个(也可以看到)有方法getInt(I:Int)
,getDouble(I:Int)
等等
还要注意,
SchemaRDD
是一个RDD[Row]
加上一个schema
,它告诉您哪个列具有哪个数据类型。如果执行.collect()
操作,则只会得到一个不包含该信息的数组[行]
。因此,除非您确实知道您的数据是什么样的,否则从SchemaRDD
获取模式,然后收集行,然后使用正确的类型信息访问每个字段。使用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的值。如果值为at,i不是整数或为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))
我猜是因为它是一根绳子?我不知道您的数据来自哪里,但是如果您查看模式,它应该表明第一列的类型是String。注意:在Spark 1.3中,SchemaRDD称为DataFrame。
val popularHashTags = sqlContext.sql("SELECT hashtags, usersMentioned, Url FROM tweets")
var hashTagsList = popularHashTags.flatMap ( x => x.getAs[Seq[String]](0))