Сбой запроса select на большом наборе данных в sqlcontext - PullRequest
2 голосов
/ 03 июня 2019

Мой код читает данные из sqlcontext.Таблица содержит 20 миллионов записей.Я хочу рассчитать totalCount в таблице.

val finalresult = sqlContext.sql(“SELECT movieid,
tagname, occurrence AS eachTagCount, count AS
totalCount FROM result ORDER BY movieid”) 

Я хочу рассчитать общее количество столбцов без использования groupby и сохранить их в текстовом файле..Я изменяю свой файл сохранения без дополнительного]

 >val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    import sqlContext.implicits._
import sqlContext._
case class DataClass(UserId: Int, MovieId:Int, Tag: String)
// Create an RDD of DataClass objects and register it as a table.
val Data = sc.textFile("file:///usr/local/spark/dataset/tagupdate").map(_.split(",")).map(p => DataClass(p(0).trim.toInt, p(1).trim.toInt, p(2).trim)).toDF()
Data.registerTempTable("tag")

val orderedId = sqlContext.sql("SELECT MovieId AS Id,Tag FROM tag ORDER BY MovieId")
orderedId.rdd
  .map(_.toSeq.map(_+"").reduce(_+";"+_))
  .saveAsTextFile("/usr/local/spark/dataset/algorithm3/output")
  // orderedId.write.parquet("ordered.parquet")
val eachTagCount =orderedId.groupBy("Tag").count()
//eachTagCount.show()
eachTagCount.rdd
 .map(_.toSeq.map(_+"").reduce(_+";"+_))
 .saveAsTextFile("/usr/local/spark/dataset/algorithm3/output2")

ОШИБКА Исполнитель: Исключение в задаче 0.0 на этапе 7.0 (TID 604) java.lang.ArrayIndexOutOfBoundsException: 1 в тегах $$ anonfun $ 6.apply(tags.scala: 46) в тегах $$ anonfun $ 6.apply (tags.scala: 46) в scala.collection.Iterator $$ anon $ 11.next (Iterator.scala: 410)

1 Ответ

1 голос
/ 03 июня 2019

Ошибка NumberFormatException, вероятно, выдается в этом месте:

p(1).trim.toInt

Она выдается, потому что вы пытаетесь проанализировать 10], что, очевидно, не является допустимым числом.

  • Вы можете попытаться найти это проблемное место в вашем файле и просто удалить дополнительные ].

  • Вы также можете попытаться отловить ошибку и указать значение по умолчанию.в случае возникновения проблем с синтаксическим анализом:

    import scala.util.Try
    
    Try(p(1).trim.toInt).getOrElse(0) //return 0 in case there is problem with parsing.
    
  • Другая вещь, которую вы можете сделать, это удалить символы, которые не являются цифрами, из строки, которую вы пытаетесь проанализировать:

    //filter out everything which is not a digit
    p(1).filter(_.isDigit).toInt)
    

Может также произойти сбой в случае, если все будет отфильтровано и оставлена ​​пустая строка, поэтому было бы неплохо также обернуть ее в Try.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...