使用类似SQL的IN子句过滤Pyspark DataFrame

时间:2016-03-08 15:00:29

标签: python sql apache-spark dataframe pyspark

我想使用类似SQL的IN子句过滤Pyspark DataFrame,如

sc = SparkContext()
sqlc = SQLContext(sc)
df = sqlc.sql('SELECT * from my_df WHERE field1 IN a')

其中a是元组(1, 2, 3)。我收到了这个错误:

  

java.lang.RuntimeException:[1.67]失败:``(''预期但标识符找到

基本上说它期待类似'(1,2,3)' 而不是a。 问题是我无法手动将值从其他作业中提取出来。

在这种情况下如何过滤?

4 个答案:

答案 0 :(得分:17)

重申@ zero323上面提到的内容:我们也可以使用列表(不仅set执行相同的操作,如下所示

from pyspark.sql.functions import col

df.where(col("v").isin(["foo", "bar"])).count()

答案 1 :(得分:1)

只需一点补充/更新:

choice_list = ["foo", "bar", "jack", "joan"]

如果您要过滤数据框“ df”,从而希望仅基于choice_list中的值的“ v”列来保留行,则

df_filtered = df.where( ( col("v").isin (choice_list) ) )

答案 2 :(得分:0)

对我有用的稍微不同的方法是使用自定义过滤器功能进行过滤。

def filter_func(a):
"""wrapper function to pass a in udf"""
    def filter_func_(col):
    """filtering function"""
        if col in a.value:
            return True

    return False

return udf(filter_func_, BooleanType())

# Broadcasting allows to pass large variables efficiently
a = sc.broadcast((1, 2, 3))
df = my_df.filter(filter_func(a)(col('field1'))) \

答案 3 :(得分:0)

您还可以对整数列执行此操作:

df_filtered = df.filter("field1 in (1,2,3)")

或对于字符串列:

df_filtered = df.filter("field1 in ('a','b','c')")