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