web-dev-qa-db-fra.com

Filtrage d'une trame de données Pyspark à l'aide d'ISIN par exclusion

J'essaie d'obtenir toutes les lignes dans une trame de données où une valeur de colonnes n'est pas dans une liste (donc filtrage par exclusion).

Par exemple:

df = sqlContext.createDataFrame([('1','a'),('2','b'),('3','b'),('4','c'),('5','d')]
,schema=('id','bar'))

J'obtiens la trame de données:

+---+---+
| id|bar|
+---+---+
|  1|  a|
|  2|  b|
|  3|  b|
|  4|  c|
|  5|  d|
+---+---+

Je souhaite uniquement exclure les lignes où se trouve la barre ("a" ou "b").

En utilisant une chaîne d'expression SQL, ce serait:

df.filter('bar not in ("a","b")').show()

Existe-t-il un moyen de le faire sans utiliser la chaîne pour l'expression SQL ou exclure un élément à la fois?

Éditer:

Je suis susceptible d'avoir une liste, ['a', 'b'], des valeurs exclues que je voudrais utiliser.

22
gabrown86

Il semble que le ~ donne les fonctionnalités dont j'ai besoin, mais je n'ai pas encore trouvé de documentation appropriée à ce sujet.

df.filter(~col('bar').isin(['a','b'])).show()



+---+---+
| id|bar|
+---+---+
|  4|  c|
|  5|  d|
+---+---+
50
gabrown86

Pourrait aussi être comme ça

df.filter(col('bar').isin(['a','b']) == False).show()
23
Alezis

Gotcha gotcha pour ceux avec leur espace de tête dans Pandas et se déplaçant vers pyspark

 from pyspark import SparkConf, SparkContext
 from pyspark.sql import SQLContext

 spark_conf = SparkConf().setMaster("local").setAppName("MyAppName")
 sc = SparkContext(conf = spark_conf)
 sqlContext = SQLContext(sc)

 records = [
     {"colour": "red"},
     {"colour": "blue"},
     {"colour": None},
 ]

 pandas_df = pd.DataFrame.from_dict(records)
 pyspark_df = sqlContext.createDataFrame(records)

Donc, si nous voulions que les lignes ne soient pas rouges:

pandas_df[~pandas_df["colour"].isin(["red"])]

As expected in Pandas

En regardant bien, et dans notre pyspark DataFrame

pyspark_df.filter(~pyspark_df["colour"].isin(["red"])).collect()

Not what I expected

Donc, après avoir creusé, j'ai trouvé ceci: https://issues.Apache.org/jira/browse/SPARK-20617 Donc, pour inclure le néant dans nos résultats:

pyspark_df.filter(~pyspark_df["colour"].isin(["red"]) | pyspark_df["colour"].isNull()).show()

much ado about nothing

13
Ryan Collingwood
df.filter((df.bar != 'a') & (df.bar != 'b'))
11
Assaf Mendelson