您传递给
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 coldf.where(col("v").isin({"foo", "bar"})).count()## 2它很容易为您构建,组成和处理HiveQL / Spark SQL的所有细节。



