2016-08-10 3 views
1

In scala/spark Code I 1 Datenrahmen hat, das einige Zeilen enthält:Wie ein Datenrahmen auf Spaltenwerte (mehrere Werte durch einen Arraybuffer) in scala filtern

col1  col2 
Abc  someValue1 
xyz  someValue2 
lmn  someValue3 
zmn  someValue4 
pqr  someValue5 
cda  someValue6 

Und ich habe eine Variable von ArrayBuffer[String] der enthält ;

Ich möchte gegebenen Datenrahmen basierend auf gegebenen Werten in Arraybuffer bei col1 filtern.

In SQL wäre es wie:

select * from tableXyz where col1 in("xyz","pqr","abc"); 

Antwort

0

Vorausgesetzt, dass Sie Ihre Datenrahmen haben:

val df = sc.parallelize(Seq(("abc","someValue1"), 
          ("xyz","someValue2"), 
          ("lmn","someValue3"), 
          ("zmn","someValue4"), 
          ("pqr","someValue5"), 
          ("cda","someValue6"))) 
       .toDF("col1","col2") 

+----+----------+ 
|col1|  col2| 
+----+----------+ 
| abc|someValue1| 
| xyz|someValue2| 
| lmn|someValue3| 
| zmn|someValue4| 
| pqr|someValue5| 
| cda|someValue6| 
+----+----------+ 

Dann können Sie eine UDF definieren die Datenrahmen zu filtern, basierend auf den Werten des Arrays:

val array = ArrayBuffer[String]("xyz","pqr","abc") 

val function: (String => Boolean) = (arg: String) => array.contains(arg) 
val udfFiltering = udf(function) 

val filtered = df.filter(udfFiltering(col("col1"))) 
filtered.show() 
+----+----------+ 
|col1|  col2| 
+----+----------+ 
| abc|someValue1| 
| xyz|someValue2| 
| pqr|someValue5| 
+----+----------+ 

Alternativ können Sie Ihren Datenrahmen registrieren und sql-Abfrage von SQLContext:

var elements = "" 
array.foreach { el => elements += "\"" + el + "\"" + "," } 
elements = elements.dropRight(1)  
val query = "select * from tableXyz where col1 in(" + elements + ")" 

df.registerTempTable("tableXyz") 
val filtered = sqlContext.sql(query) 
filtered.show() 
+----+----------+ 
|col1|  col2| 
+----+----------+ 
| abc|someValue1| 
| xyz|someValue2| 
| pqr|someValue5| 
+----+----------+ 
Verwandte Themen