spark - извлечение элементов из RDD [Row] при чтении таблицы Hive в Spark - PullRequest
0 голосов
/ 07 ноября 2018

Я собирался прочитать таблицу 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

Большое спасибо

1 Ответ

0 голосов
/ 07 ноября 2018

getAs[String](i) совпадает с

get(i).asInstanceOf[String]

поэтому это просто приведение типа. toString не .

...