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
示例
执行一个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| +---+---+