2017-06-29 6 views
1

Ich bekomme Fehler, wenn Sie "oder" verwenden, um den Datenrahmen zu filtern. Unten ist der Code:Verwenden von "oder" in Spark

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

ich versucht mit „oder“ auch, aber die gleichen Fehler.

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

Fehler:

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

Wo könnte ich falsch gemacht habe? Pls Hilfe.

Antwort

1

In Bezug auf die relational algebra, wenn Sie eine Auswahl (select) mit Spark-SQL ausführen, engt dies die Spalten nach unten, auf die Sie ausgewählt haben.

Sie können also nicht diejenigen aufrufen, die Sie nicht ausgewählt haben, um eine Projektion durchzuführen (where, filter).

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

Danke für die Erklärung und Lösung. Es funktionierte – Jayson

0

Sie haben nur zwei Spalten InvoiceNo, Description ausgewählt, und der Code versucht, basierend auf den von Ihnen ausgewählten Spalten zu filtern, in denen UnitPrice nicht vorhanden ist.

können Sie versuchen, die folgenden:

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

Im Fall müssen Sie bestimmte Spalten auswählen möchten, verwenden select nach where.

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

Das funktionierte aber meine Forderung nicht erfüllt ist:

Die Logik aus der regulären SQL-Logik so vor allem in Ihrem Fall etwas anders ist, würden Sie Folgendes tun mögen. Die select-Methode sollte nach where folgen. – Jayson

+0

yeah .. wenn Sie nur 2 Spalten auswählen müssen, dann sollte Ihre Auswahl nach dem wo folgen. –

Verwandte Themen