如何处理SparkSQL Dataframes中的空值

时间:2016-12-01 02:23:47

标签: scala apache-spark apache-spark-sql

这是我要遵循的代码:

val ebayds = sc.textFile("/user/spark/xbox.csv")

case class Auction(auctionid: String, bid: Float, bidtime: Float, bidder: String, bidderrate: Int, openbid: Float, price: Float)

val ebay = ebayds.map(a=>a.split(",")).map(p=>Auction(p(0),p(1).toFloat,p(2).toFloat,p(3),p(4).toInt,p(5).toFloat,p(6).toFloat)).toDF()

ebay.select("auctionid").distinct.count

我得到的错误是:

 For input string: ""
        at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)

2 个答案:

答案 0 :(得分:1)

使用DataFrameNaFunctions

  

DataFrame fill(double value)返回替换的新DataFrame   带有值的数字列中的空值。

     

DataFrame fill(double   value,scala.collection.Seq cols)(Scala特定的)返回一个   新的DataFrame,用于替换指定数字列中的空值。

示例用法:

df.na.fill(0.0,Seq("your columnname"))

对于该列,空值将替换为0.0或任何默认值。

replace对于使用默认值

替换空字符串也很有用
  

替换公共DataFrame替换(String col,                       java.util.Map replacement)将替换映射中匹配键的值替换为相应的值。键   替换映射的值必须具有相同的类型,并且只能是   双打或弦乐。如果col是" *",则应用替换   所有字符串列或数字列。

     

导入com.google.common.collect.ImmutableMap;

     

//在列" height"中替换所有出现的1.0和2.0   df.replace(" height",ImmutableMap.of(1.0,2.0));

     

//替换所有出现的" UNKNOWN"与"未命名"在专栏中   "名称&#34 ;. df.replace(" name",ImmutableMap.of(" UNKNOWN"," unnamed"));

     

//替换所有出现的" UNKNOWN"与"未命名"在所有   字符串列。 df.replace(" *",ImmutableMap.of(" UNKNOWN",   "未命名&#34));参数:col - 要应用值的列的名称   更换替换 - 价值替换地图,如上所述   返回:(未记录)从:   1.3.1

例如:

df.na.replace("your column", Map(""-> 0.0)))

答案 1 :(得分:0)

这对我有用。它返回了一个数据帧。此处AB是列,1.0"unknown"是要替换的值。

df.na.fill(Map("A" -> "unknown","B" -> 1.0))