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.
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|
+---+---+
Pourrait aussi être comme ça
df.filter(col('bar').isin(['a','b']) == False).show()
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"])]
En regardant bien, et dans notre pyspark DataFrame
pyspark_df.filter(~pyspark_df["colour"].isin(["red"])).collect()
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()
df.filter((df.bar != 'a') & (df.bar != 'b'))