2017-07-26 10 views
2

テーブルからNULL値のみを含む列を削除するにはどうすればよいですか?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列を持っているし、残りを無視したい - 私はテーブルがあるとします。

動的に列を選択する方法はありますか?

私はあなたがそれがスパークSQLでカスタムUDFを加えることができ、スパーク1.6.1

答えて

0

を使用しています。

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 | 
+---+ 
関連する問題