[英]How can i process the empty strings present in records and get if processed via 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:空字符串
您可以使用filter或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)
附:代码未经测试! 但它应该工作!
如果要保留数据而不是过滤掉数据,可以尝试使用“尝试”和“选项”:
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)
如果为null或作为以下实例调用,请尝试使用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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.