Я собирался прочитать таблицу Hive в spark, используя scala, извлечь из нее некоторые / все поля и затем сохранить данные в HDFS.
Мой код выглядит следующим образом:
val data = spark.sql("select * from table1 limit 1000")
val new_rdd = data.rdd.map(row => {
var arr = new ArrayBuffer[String]
val len = row.size
for(i <- 0 to len-1) arr.+=(row.getAs[String](i))
arr.toArray
})
new_rdd.take(10).foreach(println)
new_rdd.map(_.mkString("\t")).saveAsTextFile(dataOutputPath)
Приведенный выше фрагмент является тем, который наконец заработал.
Я написал другую версию, где эта строка:
for(i <- 0 to len-1) arr.+=(row.getAs[String](i))
был заменен на эту строку:
for(i <- 0 to len-1) arr.+=(row.get(i).toString)
Для меня обе строки делали одно и то же: для каждой строки я получаю i-й элемент в виде строки и помещаю его в ArrayBuffer, который в конце приходит к массиву.
Однако оба метода дают разные результаты.
Первая строка работает хорошо. Данные были правильно сохранены в HDFS.
Пока выдается ошибка, когда я собираюсь сохранить данные при использовании второй строки:
ОШИБКА ApplicationMaster: Исключение класса пользователя:
org.apache.spark.SparkException: задание прервано из-за сбоя этапа: задача 56
на этапе 3.0 не удалось 4 раза, последний сбой: потерянное задание 56.3 на этапе
3.0 (TID 98, ip-172-31-18-87.ec2.internal, исполнитель 6):
java.lang.NullPointerException
Поэтому мне интересно, есть ли какие-то внутренние различия между
getAs[String](i)
и
get(i).toString
Большое спасибо