web-dev-qa-db-fra.com

pyspark dataframe filtrer ou inclure en fonction de la liste

J'essaie de filtrer une structure de données dans pyspark à l'aide d'une liste. Je veux soit filtrer en fonction de la liste ou inclure uniquement les enregistrements avec une valeur dans la liste. Mon code ci-dessous ne fonctionne pas:

# define a dataframe
rdd = sc.parallelize([(0,1), (0,1), (0,2), (1,2), (1,10), (1,20), (3,18), (3,18), (3,18)])
df = sqlContext.createDataFrame(rdd, ["id", "score"])

# define a list of scores
l = [10,18,20]

# filter out records by scores by list l
records = df.filter(df.score in l)
# expected: (0,1), (0,1), (0,2), (1,2)

# include only records with these scores in list l
records = df.where(df.score in l)
# expected: (1,10), (1,20), (3,18), (3,18), (3,18)

Donne l'erreur suivante: ValueError: impossible de convertir une colonne en booléen: veuillez utiliser '&' pour 'et', '|' pour 'ou', '~' pour 'pas' lors de la construction d'expressions booléennes DataFrame.

26
user3133475

ce qu'il dit, c'est "df.score in l" ne peut pas être évalué car df.score vous donne une colonne et "in" n'est pas défini sur ce type de colonne, utilisez "isin"

Le code devrait être comme ceci:

# define a dataframe
rdd = sc.parallelize([(0,1), (0,1), (0,2), (1,2), (1,10), (1,20), (3,18), (3,18), (3,18)])
df = sqlContext.createDataFrame(rdd, ["id", "score"])

# define a list of scores
l = [10,18,20]

# filter out records by scores by list l
records = df.filter(~df.score.isin(l))
# expected: (0,1), (0,1), (0,2), (1,2)

# include only records with these scores in list l
df.where(df.score.isin(l))
# expected: (1,10), (1,20), (3,18), (3,18), (3,18)
46
user3133475