2015-11-17 7 views
9

持つこんにちは、私は次の問題があります。Sparksqlフィルタリング(where句で選択)複数の条件

numeric.registerTempTable("numeric"). 

私がフィルタリングしたいすべての値は、リテラルヌル文字列ではなくN/AまたはNULL値です。

は、私はこれらの3つのオプションを試してみました:

  1. numeric_filtered = numeric.filter(numeric['LOW'] != 'null').filter(numeric['HIGH'] != 'null').filter(numeric['NORMAL'] != 'null')

  2. numeric_filtered = numeric.filter(numeric['LOW'] != 'null' AND numeric['HIGH'] != 'null' AND numeric['NORMAL'] != 'null')

  3. sqlContext.sql("SELECT * from numeric WHERE LOW != 'null' AND HIGH != 'null' AND NORMAL != 'null'")

残念ながら、常に空numeric_filteredです。チェックした数値には、これらの条件に基づいてフィルタリングする必要があるデータがあります。

低高ノーマル

3.5 5.0ヌル

2.0 14.0ヌル

ヌル38.0ヌル

ヌルヌルヌル

1.0:ここ

は、いくつかのサンプル値であり、ヌル4.0

答えて

17

論理結合(AND)を使用しています。これは、列が含まれるためには、すべての列が'null'と異なる必要があることを意味します。

numeric = sqlContext.createDataFrame([ 
    ('3.5,', '5.0', 'null'), ('2.0', '14.0', 'null'), ('null', '38.0', 'null'), 
    ('null', 'null', 'null'), ('1.0', 'null', '4.0')], 
    ('low', 'high', 'normal')) 

numeric_filtered_1 = numeric.where(numeric['LOW'] != 'null') 
numeric_filtered_1.show() 

## +----+----+------+ 
## | low|high|normal| 
## +----+----+------+ 
## |3.5,| 5.0| null| 
## | 2.0|14.0| null| 
## | 1.0|null| 4.0| 
## +----+----+------+ 

numeric_filtered_2 = numeric_filtered_1.where(
    numeric_filtered_1['NORMAL'] != 'null') 
numeric_filtered_2.show() 

## +---+----+------+ 
## |low|high|normal| 
## +---+----+------+ 
## |1.0|null| 4.0| 
## +---+----+------+ 

numeric_filtered_3 = numeric_filtered_2.where(
    numeric_filtered_2['HIGH'] != 'null') 
numeric_filtered_3.show() 

## +---+----+------+ 
## |low|high|normal| 
## +---+----+------+ 
## +---+----+------+ 

あなたが試した残りのすべてのメソッドはまったく同じスキーマに従ってください。例としてfilterバージョンを使用していることを示します。あなたがここで必要とするのは論理的論理和(OR)です。

from pyspark.sql.functions import col 

numeric_filtered = df.where(
    (col('LOW') != 'null') | 
    (col('NORMAL') != 'null') | 
    (col('HIGH') != 'null')) 
numeric_filtered.show() 

## +----+----+------+ 
## | low|high|normal| 
## +----+----+------+ 
## |3.5,| 5.0| null| 
## | 2.0|14.0| null| 
## |null|38.0| null| 
## | 1.0|null| 4.0| 
## +----+----+------+ 

または生のSQLを持つ:

numeric.registerTempTable("numeric") 
sqlContext.sql("""SELECT * FROM numeric 
    WHERE low != 'null' OR normal != 'null' OR high != 'null'""" 
).show() 

## +----+----+------+ 
## | low|high|normal| 
## +----+----+------+ 
## |3.5,| 5.0| null| 
## | 2.0|14.0| null| 
## |null|38.0| null| 
## | 1.0|null| 4.0| 
## +----+----+------+ 

も参照してください:Pyspark: multiple conditions in when clause

+0

感謝を!それはたくさんの助けになりました。重要なことは、個々の条件を括弧で囲むことです**(** col( 'foo')== 'bar' **)** –

関連する問題