pyspark.sql.SparkSession.sql

SparkSession. sql ( sqlQuery : str , args : Union[Dict[str, Any], List, None] = None , ** kwargs : Any ) → pyspark.sql.dataframe.DataFrame [source]

返回一个表示给定查询结果的 DataFrame 。 当指定 kwargs 时,此方法使用 Python 标准格式化程序格式化给定的字符串。该方法将命名参数绑定到 SQL 文本或来自 args 的位置参数。它不支持在同一 SQL 查询中同时使用命名参数和位置参数。

新增于版本 2.0.0。

在版本 3.4.0 中更改: 支持 Spark Connect 和参数化 SQL。

在版本3.5.0中更改: 添加了位置参数。

Parameters
sqlQuery str

SQL查询字符串。

args dict or list

一个参数名称到Python对象的字典或一个可以转换为SQL文字表达式的Python对象列表。请参阅 https://spark.apache.org/docs/latest/sql-ref-datatypes.html ”> 支持的数据类型以了解Python中支持的值类型。 例如,字典键:“rank”、“name”、“birthdate”; 字典或列表值:1、“Steven”、datetime.date(2023, 4, 2)。 一个值也可以是 Column 的文字表达式,在这种情况下,它将按原样使用。

新增于版本 3.4.0。

kwargs dict

用户想要设置并在查询中引用的其他变量

版本 3.3.0 更改: 添加了可选参数 kwargs 以指定查询中变量的映射。 此功能是实验性的且不稳定。

Returns
DataFrame

示例

执行一个SQL查询。

>>> spark.sql("SELECT * FROM range(10) where id > 7").show()
+---+
| id|
+---+
|  8|
|  9|
+---+

使用Python格式化标准执行带有变量的SQL查询。

>>> spark.sql(
...     "SELECT * FROM range(10) WHERE id > {bound1} AND id < {bound2}", bound1=7, bound2=9
... ).show()
+---+
| id|
+---+
|  8|
+---+
>>> mydf = spark.range(10)
>>> spark.sql(
...     "SELECT {col} FROM {mydf} WHERE id IN {x}",
...     col=mydf.id, mydf=mydf, x=tuple(range(4))).show()
+---+
| id|
+---+
|  0|
|  1|
|  2|
|  3|
+---+
>>> spark.sql('''
...   SELECT m1.a, m2.b
...   FROM {table1} m1 INNER JOIN {table2} m2
...   ON m1.key = m2.key
...   ORDER BY m1.a, m2.b''',
...   table1=spark.createDataFrame([(1, "a"), (2, "b")], ["a", "key"]),
...   table2=spark.createDataFrame([(3, "a"), (4, "b"), (5, "b")], ["b", "key"])).show()
+---+---+
|  a|  b|
+---+---+
|  1|  3|
|  2|  4|
|  2|  5|
+---+---+

此外,还可以使用来自 DataFrame 的类: Column 进行查询。

>>> mydf = spark.createDataFrame([(1, 4), (2, 4), (3, 6)], ["A", "B"])
>>> spark.sql("SELECT {df.A}, {df[B]} FROM {df}", df=mydf).show()
+---+---+
|  A|  B|
+---+---+
|  1|  4|
|  2|  4|
|  3|  6|
+---+---+

并将命名参数替换为以 : 前缀的 SQL 字面量。

>>> spark.sql("SELECT * FROM {df} WHERE {df[B]} > :minB", {"minB" : 5}, df=mydf).show()
+---+---+
|  A|  B|
+---+---+
|  3|  6|
+---+---+

或者在SQL查询中由SQL字面量标记的位置参数 ?

>>> spark.sql(
...   "SELECT * FROM {df} WHERE {df[B]} > ? and ? < {df[A]}",
...   args=[5, 2], df=mydf).show()
+---+---+
|  A|  B|
+---+---+
|  3|  6|
+---+---+