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

新手上路,请多包涵

我想用类似 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] failure: ``(” 预期但发现标识符 a

这基本上是说它期待像 ‘(1,2,3)’ 而不是a。问题是我无法在 a 中手动写入值,因为它是从另一个作业中提取的。

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

原文由 mar tin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 761
2 个回答

您传递给的字符串 SQLContext 它在 SQL 环境的范围内进行了评估。它没有捕获关闭。如果要传递变量,则必须使用字符串格式明确地进行:

 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 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 user2662006 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题