2016-11-04 1 views
2

J'essaie de filtrer une base de données dans pyspark en utilisant une liste. Je veux filtrer en fonction de la liste ou inclure uniquement les enregistrements ayant une valeur dans la liste. Mon code ci-dessous ne fonctionne pas:pyspark filtre de données ou inclure basé sur la liste

# 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 la colonne en bool: s'il vous plaît utiliser « & » pour « et », « | » pour 'or', '~' pour 'not' lors de la construction d'expressions booléennes DataFrame.

Répondre

7

ce qu'il dit est « df.score en l » ne peut pas être évaluée parce que df.score vous donne une colonne et « dans » n'est pas définie sur cette utilisation de type colonne « isin »

Le code doit ê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)