it-swarm.com.ru

Извлечь информацию из `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, но они чувствуют себя не так ...

15
sds

Использование 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:

Возвращает значение столбца i как int. Эта функция сгенерирует исключение, если значение в i не является целым числом или если оно равно нулю.

Таким образом, он не будет пытаться бросить для вас, кажется,

11
Justin Pihony

Класс Row (также см. 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]plus a schema, который сообщает вам, какой столбец имеет какой тип данных. Если вы выполните .collect(), вы получите только Array[Row], в котором not нет этой информации. Поэтому, если вы не знаете наверняка, как выглядят ваши данные, получите схему из SchemaRDD, затем соберите строки и затем получите доступ к каждому полю, используя правильную информацию о типе.

2
tgpfeiffer

ответ актуален. вам не нужно использовать метод collect вместо этого, вам нужно вызывать методы getIntgetString и getAs, а также в случае, если тип данных сложный

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