2016-11-04 16 views
2

Я пытаюсь фильтровать dataframe в pyspark, используя список. Я хочу либо фильтровать на основе списка, либо включать только те записи со значением в списке. Мой код ниже не работает:pyspark dataframe фильтр или включить на основе списка

# 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) 

дает следующее сообщение об ошибке: ValueError: Не удается преобразовать столбец в BOOL: пожалуйста, используйте «&» для «и», «|» для 'или', '~' для 'не' при построении булевых выражений DataFrame.

ответ

7

что он говорит «df.score л» не может быть оценена, поскольку df.score дает столбец и «в» не определен на этом колонного типа использования «ISIN»

Код должен быть например:

# 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)