2017-07-26 70 views
2

如何從表中刪除只包含空值的列?假設我有一個表 -刪除Spark SQL中的NULL列

SnapshotDate CreationDate Country Region CloseDate Probability BookingAmount RevenueAmount SnapshotDate1 CreationDate1 CloseDate1 
     null   null  null null  null 25 882000 0   null   null   null 
     null   null  null null  null 25 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 
     null   null  null null  null 0 882000 0   null   null   null 

所以我只是想有概率,BookingAmount和RevenueAmount列而忽略其他。

有沒有辦法動態選擇列?

我使用的火花1.6.1

回答

0

可以在星火SQL添加自定義UDF,以及它。

sqlContext.udf.register("ISNOTNULL", (str: String) => Option(str).getOrElse("")) 

並與星火SQL你可以這樣做:

SELECT ISNOTNULL(Probability) Probability, ISNOTNULL(BookingAmount) BookingAmount, ISNOTNULL(RevenueAmount) RevenueAmount FROM df 
+0

嗨@elarib。它的工作,但它並沒有刪除那些無效的列。它用空白替換NULL。我根本不需要那些列 –

0

我解決了這個與全球groupBy和它的作品的數字和非數字列:

case class Entry(id: Long, name: String, value: java.lang.Float) 

val results = Seq(
    Entry(10, null, null), 
    Entry(10, null, null), 
    Entry(20, null, null) 
) 

val df: DataFrame = spark.createDataFrame(results) 

// mark all columns with null only 
val row = df 
    .select(df.columns.map(c => when(col(c).isNull, 0).otherwise(1).as(c)): _*) 
    .groupBy().max(df.columns.map(c => c): _*) 
    .first 

// and filter the columns out 
val colKeep = row.getValuesMap[Int](row.schema.fieldNames) 
    .map{c => if (c._2 == 1) Some(c._1.drop(4).dropRight(1)) else None } 
    .flatten.toArray 
df.select(colKeep.map(c => col(c)): _*).show(false) 

+---+ 
|id | 
+---+ 
|10 | 
|10 | 
|20 | 
+---+