2016-11-22 4 views
0

Ниже представлена ​​структура таблицы. У меня есть группа записей, представленных в таблице ниже.Как я могу обрабатывать пустые строки, присутствующие в записях, и получать, если их обрабатывать через Spark-Scala?

продукты:

product_id | product_category_id | product_name | product_descrition | PRODUCT_PRICE | product_image

Я хотел, чтобы отсортировать данные, основанные на PRODUCT_PRICE, Поскольку он содержит нулевые данные я получаю ниже исключение . Как я могу достичь этого в Spark-Scala?

val productsRDD = sc.textFile("/user/cloudera/products") 
productsRDD.map(rec=>rec.split(",")(4).toFloat,rec).sortByKey().take(5).foreach(println) 

Исключение:

java.lang.NumberFormatException: пустая строка

ответ

1

Если вы хотите сохранить данные, а не фильтрации его можно попробовать попробовать и опционов:

import scala.util.Try  

val productsRDD = sc.textFile("/user/cloudera/products") 
productsRDD.map(rec=> (Try(rec.split(",")(4).toFloat).toOption, rec)).sortByKey().take(5).foreach(println) 

Если вы хотите установить значение по умолчанию, вы можете попробовать что-то вроде этого:

import scala.util.Try  

val default = Float.MaxValue 
val productsRDD = sc.textFile("/user/cloudera/products") 
productsRDD.map(rec=> (Try(rec.split(",")(4).toFloat).getOrElse(default), rec)).sortByKey().take(5).foreach(println) 
2

Вы можете использовать фильтр или метод filterNot фильтровать пустые строки, как это:

val productsRDD = sc.textFile("/user/cloudera/products") 
import scala.util.Try 
productsRDD.map{rec=> 
val floatValue = Try(rec.split(",")(4).toFloat).toOption 
(floatValue,rec) 
}.filter(_._1.isDefined).map(a=>(a._1.get,a._2)).sortByKey().take(5).foreach(println) 

Ps: Код не проверен! но это должно сработать!

+0

Это не правильно :) – eliasah

+0

@eliasah: Хорошая добыча! , Это сейчас ? ;) –

+0

Это лучше, но это можно сделать лучше. На самом деле это предполагает, что строка пуста, если она не является float, что неверно также – eliasah

0

Попробуйте этот подход, используя 0 в случае нулевой или вызова в качестве экземпляра:

def nullOrFloat(x : String) : Float = x match { 
    case x:String => java.lang.Float.parseFloat(x) 
    case null => null.asInstanceOf[Float] 
    } 

    val productsRDD = sc.textFile("/user/cloudera/products") 
    productsRDD.map(rec=> (nullOrFloat(rec.split(",")(4)),rec)).sortByKey().take(5).foreach(println) 

 Смежные вопросы

  • Нет связанных вопросов^_^