2017-06-29 7 views
1

"または"を使用してデータフレームをフィルタリングするとエラーが発生します。Sparkで "or"を使用する

df.select("InvoiceNo","Description").where((col("InvoiceNo") !== 536365) || (col("UnitPrice") > 600)) 

私が使用して「または」も同じエラーを取得しようとした: は、以下のコードです。

df.select("InvoiceNo","Description").where((col("InvoiceNo") !== 536365).or(col("UnitPrice") > 600)) 

エラー:

org.apache.spark.sql.AnalysisException: cannot resolve 'UnitPrice' given input columns: [InvoiceNo, Description] 

私が間違っているだろうか? Plsヘルプ。

答えて

1

あなたはスパークSQLを選択(select)を実行すると、これはあなたが選択しているに列を絞り込みます。

これで、選択していないプロジェクションを呼び出すことはできません(wherefilter)。

ロジックはあなたのケースでそう主に通常のSQLロジックとは若干異なっている、あなたは次のことをしたいと思う:

val df2 = df 
.where((col("InvoiceNo") !== 536365).or(col("UnitPrice") > 600)) // projection (π) 
.select("InvoiceNo","Description") // selection (σ) 
+1

説明と解決に感謝します。出来た – Jayson

0

InvoiceNo, Descriptionという2つの列しか選択されておらず、コードはUnitPriceが存在しない選択した列に基づいてフィルタを適用しようとしています。

あなたは次のことを試すことができます。

df.select("InvoiceNo","Description","UnitPrice").where((col("InvoiceNo") !== 536365).or(col("UnitPrice") > 600)) 

場合、あなたは、特定の列を選択しwhereselectを使用する必要があります。 relational algebraの面では

df.where((col("InvoiceNo") !== 536365).or(col("UnitPrice") > 600)).select("InvoiceNo","Description","UnitPrice") 
+0

これは働いていたが、私の要件が満たされていません。どこで選択メソッドを実行する必要があります。 – Jayson

+0

ええ..あなたが2列だけを選択しなければならないなら、あなたの選択はどこに続くべきですか? –

関連する問題