繁体   English   中英

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

[英]Filtering a Pyspark DataFrame with SQL-like IN clause

我想用类似 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。 问题是我无法在 a 中手动写入值,因为它是从另一个作业中提取的。

在这种情况下我将如何过滤?

您传递给它在 SQL 环境范围内评估的SQLContext字符串。 它不捕获闭包。 如果要传递变量,则必须使用字符串格式显式执行此操作:

df = sc.parallelize([(1, "foo"), (2, "x"), (3, "bar")]).toDF(("k", "v"))
df.registerTempTable("df")
sqlContext.sql("SELECT * FROM df WHERE v IN {0}".format(("foo", "bar"))).count()
##  2 

显然,出于安全考虑,这不是您将在“真实”SQL 环境中使用的东西,但在这里应该无关紧要。

实际上,当您想要创建动态查询时, DataFrame DSL 是一个更好的选择:

from pyspark.sql.functions import col

df.where(col("v").isin({"foo", "bar"})).count()
## 2

很容易为您构建和组合并处理 HiveQL/Spark SQL 的所有细节。

重申@zero323 上面提到的内容:我们也可以使用列表(不仅是set来做同样的事情,如下所示

from pyspark.sql.functions import col

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

只是一点点添加/更新:

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

如果你想过滤你的数据框“df”,这样你就想根据列“v”保留行,只取choice_list中的值,然后

from pyspark.sql.functions import col

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

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

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

或者这对于字符串列:

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

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

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'))) \
from pyspark.sql import SparkSession
import pandas as pd
spark=SparkSession.builder.appName('Practise').getOrCreate()
df_pyspark=spark.read.csv('datasets/myData.csv',header=True,inferSchema=True)
df_spark.createOrReplaceTempView("df") # we need to create a Temp table first
spark.sql("SELECT * FROM df where Departments in ('IOT','Big Data') order by Departments").show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM