繁体   English   中英

如何处理记录中存在的空字符串,以及如何通过Spark-Scala进行处理?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM