2017-09-04 1 views
0

J'ai une instance extraite d'une dataframe df1 et je veux vérifier si cette instance se trouve dans une autre dataframe df2 dans Pyspark. Y a-t-il un moyen d'y faire face?Comment puis-je vérifier si une instance se trouve dans une image dans Pyspark?

Par exemple:

Instance:

+------+------+------+ 
| Atr1 | Atr2 | Atr3 | 
+------+------+------+ 
| 'A' | 2 | 'B' | 
+------+------+------+ 

dataframe:

+------+------+------+ 
| Atr1 | Atr2 | Atr3 | 
+------+------+------+ 
| 'C' | 1 | 'B' | 
+------+------+------+ 
| 'D' | 2 | 'A' | 
+------+------+------+ 
| 'E' | 2 | 'C' | 
+------+------+------+ 
| 'A' | 2 | 'B' | 
+------+------+------+ 

De cette façon, je veux obtenir vrai parce que l'instance est dans la trame de données (4ème ligne).

Merci.

+0

Je ne sais pas si j'ai bien compris votre question, mais cherchez-vous quelque chose comme ['except'] (https://spark.apache.org/docs/latest/api/java/org/apache/ spark/sql/Dataset.html # except-org.apache.spark.sql.Dataset-)? – philantrovert

+0

Je cherche quelque chose de contraire à except. Je veux dire, quelque chose qui me dit si une instance est dans une base de données. Je vais éditer ma question pour mieux comprendre. – jartymcfly

+0

Avez-vous essayé 'instance.except (df) .take (1) .isEmpty'? – philantrovert

Répondre

1

Pyspark n'est pas la bonne langue pour ce faire, mais encore:

Tout d'abord, nous allons créer nos dataframes:

df1 = spark.createDataFrame(sc.parallelize([['A', 2, 'B']]), ['Atr1', 'Atr2', 'Atr3']) 
df2 = spark.createDataFrame(sc.parallelize([['C',1,'B'],['D',2,'A'],['E',2,'C'],['A',2,'B']]), ['Atr1', 'Atr2', 'Atr3']) 

vous pouvez utiliser:

  • subtract

    df1.subtract(df2).count() == 0 
    
  • un join

    df2.join(df1, ['Atr1', 'Atr2', 'Atr3']).count() > 0 
    
  • un filter

    df2.filter((df2.Atr1 == 'A') & (df2.Atr2 == 2) & (df2.Atr3 == 'B')).count() > 0 
    

Hope this helps!

0

Vous pouvez prendre l'intersection de df1 et df2 et comparer si le nombre de df1 est égale à celle de l'intersection comme suit:

>>> df1 = spark.createDataFrame(sc.parallelize([['A', 2, 'B']]), ['Atr1', 'Atr2', 'Atr3']) 
>>> df2 = spark.createDataFrame(sc.parallelize([['C',1,'B'],['D',2,'A'],['E',2,'C'],['A',2,'B']]), ['Atr1', 'Atr2', 'Atr3']) 
>>> df1.show() 
+----+----+----+ 
|Atr1|Atr2|Atr3| 
+----+----+----+ 
| A| 2| B| 
+----+----+----+ 

>>> df2.show() 
+----+----+----+ 
|Atr1|Atr2|Atr3| 
+----+----+----+ 
| C| 1| B| 
| D| 2| A| 
| E| 2| C| 
| A| 2| B| 
+----+----+----+ 

>>> df2.intersect(df1).count() == df1.count() 
True 
>>> 

Pour plus d'informations sur pyspark.sql.DataFrame.intersect, consultez la documentation here.