2017-07-26 38 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 | 
+---+