2015-09-18 44 views
6

başka dataframe karşı bir kıvılcım dataframe filtrelemek için df2 ("valid_id") içinde. user_id ya 2,3,4,5 ya da ben bir işlevi karşı bir filtre yapmaya çalışacağım Öte yandannasıl diğerine karşı bir dataframe filtrelemek çalışıyorum

scala> df1.select("user_id").filter($"user_id" in df2("valid_id")) 
warning: there were 1 deprecation warning(s); re-run with -deprecation for details 
org.apache.spark.sql.AnalysisException: resolved attribute(s) valid_id#20 missing from user_id#18 in operator !Filter user_id#18 IN (valid_id#20); 

6 olduğu diğer bir deyişle, her şey harika görünüyor df1 tüm satırları istiyorum :

scala> df1.select("user_id").filter(($"user_id" % 2) === 0) 
res1: org.apache.spark.sql.DataFrame = [user_id: int] 

Neden bu hatayı alıyorum? Sözdizimde yanlış bir şey mi var? Bir sol dış yapmaya çalıştık

aşağıdaki açıklama katılmak:

scala> df1.show 
+-------+------------------+-------+ 
| name|    score|user_id| 
+-------+------------------+-------+ 
| user 1|    0.123|  1| 
| user 2|    0.246|  2| 
| user 3|    0.369|  3| 
| user 4|    0.492|  4| 
| user 5|    0.615|  5| 
| user 6|    0.738|  6| 
| user 7|    0.861|  7| 
| user 8|    0.984|  8| 
| user 9|    1.107|  9| 
|user 10|    1.23|  10| 
|user 11|    1.353|  11| 
|user 12|    1.476|  12| 
|user 13|    1.599|  13| 
|user 14|    1.722|  14| 
|user 15|    1.845|  15| 
|user 16|    1.968|  16| 
|user 17|    2.091|  17| 
|user 18|    2.214|  18| 
|user 19|2.3369999999999997|  19| 
|user 20|    2.46|  20| 
+-------+------------------+-------+ 
only showing top 20 rows 

scala> df2.show 
+--------+ 
|valid_id| 
+--------+ 
|  2| 
|  3| 
|  4| 
|  5| 
|  6| 
+--------+ 

scala> df1.join(df2, df1("user_id") === df2("valid_id")) 
res6: org.apache.spark.sql.DataFrame = [name: string, score: double, user_id: int, valid_id: int] 
scala> res6.collect 
res7: Array[org.apache.spark.sql.Row] = Array() 

scala> df1.join(df2, df1("user_id") === df2("valid_id"), "left_outer") 
res8: org.apache.spark.sql.DataFrame = [name: string, score: double, user_id: int, valid_id: int] 
scala> res8.count 
res9: Long = 0 

Ben scala ile kıvılcım 1.5.0 çalıştırıyorum 2.10.5

+0

İki Dataframe üzerinde bir birleştirmeyi filtrelemek veya gerçekleştirmek mi istiyorsunuz? – eliasah

+0

@eliasah Df1'den satırların bir alt kümesine sahip bir veri çerçevesi almak istiyorum. df1'de her satır r için, r ("kullanici_kimliği") değeri df2 ("valid_id") durumundaysa, sonuç veri karesine satır r dahil edilecektir. – polo

+0

O zaman denemek istediğimde userId == validId – eliasah

cevap

11

Bir (düzenli) iç birleşim, değil istiyorum Bir dış katılım :)

df1.join(df2, df1("user_id") === df2("valid_id")) 
+0

soruya bir örnek ekleyeceğim Kesinlikle! Üzgünüm benim hatam! Şimdi biliyorum uykusuzluk ile gitmek için iyi bir fikir değil :) – eliasah

+0

@ glennie-helles-sindholt: Cevabınız için teşekkürler. Bu mantıklı, ancak boş bir veri karesi döndürür. Soruda kod örneği ile düzenlemelerimi görün. – polo

+0

@polo Görebildiğim kadarıyla her şeyin doğru olduğunu söylemeliyim. Komutlarınızı kendi kabuğuma kopyaladım (ayrıca Spark 1.5.0'ı çalıştırıyorum) ve her şey mükemmel çalışıyor. Değişime göre açık bir ifadeye sahip olursunuz, yani kabuğunuzda bir yerde bulunan yeni bir SparkContext (conf) var mı? Kısa bir süre önce garip davranışlar gören başka birine rastladım çünkü kendi sc-değişkenini ilan etmişti. Aksi halde, problemi yeniden üretemediğim için yeni fikirlerim var. Kabuğunu yeniden başlatmayı denediğini mi sanıyorum? –

İlgili konular