1. 程式人生 > >Spark2-對於Null/Nan的處理

Spark2-對於Null/Nan的處理

    在Scala中,Double型別的空值儲存為NaN,其他儲存為null。對於Double可以直接使用:bianliang.isNaN判斷其是否是空值,那麼在一個多行多列的DataSet或者DataFrame中怎麼進行處理呢。

一、幾種查詢空值的方法

1、Column方法

    column.isNull/column.isNotNull/column.isNaN

  1. df("col1").isNull
  2. df.filter(df("col1").isNull)就可以獲取所有col1列為空值的行了。
  3. //獲取col1欄位所有空列
  4. df.filter(df("col1").isNull).count()
  5. df.filter(df("col1").isNotNull).count()

2、類sql方法

  1. //獲取col1欄位所有空列
  2. data1.filter("col1 is null").select("col1").limit(10).show
  3. //獲取col1欄位的所有非空列
  4. data1.filter("col1 is not null").select("col1").limit(10).show
  5. data1.filter("col1 <>''").select("col1").limit(10).show

二、na方法

  1. val naDF:DataFrameNaFunctions=df.na

呼叫na方法會返回一個DataFrameNaFunctions。其只有3個方法,drop、fill、replace。

2.1 na.drop方法

2.1.1 刪除所有列的空值以及NaN

  1. val resNull=df.na.drop()

返回一個新DF,剔除了包含空值的行。

2.1.2 刪除某一列的空值和NaN

  1. val res =df.na.drop(Array("col1","col2"))

2.1.3 刪除某一列的非空非NaN但是值低於10的。

  1. df.na.drop(10,Array("col1","col2"))

2.2 na.fill方法

2.2.1 填充所有空值的列

  1. val res123=df.na.fill("新值")
  2. val res123=df.na.fill(10)​

2.2.2 對指定的空值進行填充

    傳入一個值,以及所有需要用此值填充的Array,或者使用Map,按照列進行不同填充。

  1. val res2=data1.na.fill(value="wangxiao111",cols=Array("gender","yearsmarried") )
  2. val res3=data1.na.fill(Map("gender"->"wangxiao222","yearsmarried"->"wangxiao567") )

2.3 na.replace方法

2.3.1 將指定列的指定值替換為對應的值

  1. df.na.replace("col1",Map(1->2)) //將col1列的值為1替換為2.
  2. df.na.replace(Array("col1","col2"),Map(1->2))​​
  3. df.na.replace[Int]("col1",Map(1->2))//可以新增泛型,Map中的key和value型別必須與其保持一致。