Подтвердить что ты не робот

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

4b9b3361

Ответ 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

В документации указано, что getInt:

Возвращает значение столбца я как int. Эта функция генерирует исключение, если значение в я не является целым числом, или если оно равно 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) и т.д.

Также обратите внимание, что a SchemaRDD является RDD[Row] плюс a schema, который сообщает вам, какой из столбцов имеет тип данных. Если вы сделаете .collect(), вы получите только Array[Row], который не имеет этой информации. Поэтому, если вы точно не знаете, как выглядят ваши данные, получите схему из SchemaRDD, затем соберите строки и затем получите доступ к каждому полю, используя правильную информацию о типе.

Ответ 3

Ответ важен. вам не нужно использовать коллекцию, вместо этого вам нужно вызвать методы getInt getString и getAs, а также в случае сложного типа данных

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