Parametre işaretçileri

Parametre işaretçileri, SQL deyimini çağıran API'den değer sağlamak için kullanılan adlandırılmış veya adlandırılmamış yer tutucu değişkenleridir.

Parametre işaretçilerinin kullanılması, sağlanan değerleri SQL deyimlerinden açıkça ayırdığından kodunuzu SQL ekleme saldırılarına karşı korur.

Adlandırılmış ve adlandırılmamış parametre işaretçilerini aynı SQL deyiminde karıştıramazsınız.

Oluşturulan sütun veya tanım, görünüm veya DEFAULT SQL işlevi gibi bir DDL deyimindeki parametre işaretçilerine başvurmamalısınız.

Özel durumlar, yan tümcesindeki IDENTIFIER parametre işaretçilerine başvurudur ve bu, belirli DDL deyimlerindeki tablo veya sütun adlarını parametreleştirmek için kullanılabilir. Bkz. IDENTIFIER yan tümcesi.

Parametre işaretçileri şu şekilde sağlanabilir:

  • pyspark.sql.SparkSession.sql() API'sini kullanan Python.
  • Scala, org.apache.spark.sql.SparkSession.sql() API'sini kullanır.
  • org.apache.spark.sql.SparkSession.sql() API'sini kullanan Java.

Adlandırılmış parametre işaretçileri

Şunlar için geçerlidir: Databricks Runtime check marked yes 12.1 ve üzeri

Adlandırılmış parametre işaretçileri, yazılan yer tutucu değişkenleridir. SQL deyimini çağıran API'nin, her parametre işaretçisini bir değerle ilişkilendirmek için ad-değer çiftleri sağlaması gerekir.

Sözdizimi

 :parameter_name

Parametreler

  • named_parameter_name

    Nitelenmemiş tanımlayıcı biçiminde sağlanan parametre işaretçisine başvuru.

Notlar

Aynı SQL Deyimi içinde aynı parametre işaretçisine birden çok kez başvurabilirsiniz. Parametre işaretçisine hiçbir değer bağlanmadıysa bir UNBOUND_SQL_PARAMETER hatası oluşur. Sağlanan tüm parametre işaretçilerine başvurmanız gerekmez.

Yukarıdaki zorunlu : (iki nokta üst üste), adlandırılmış parametre işaretleyicilerinin ad alanını sütun adlarından ve SQL parametrelerinden ayırır.

Örnekler

Aşağıdaki örnek iki parametre işaretçisini tanımlar:

  • daha sonra: 3 değerine sahip bir INTERVAL HOUR .
  • x: 15.0 değerine sahip A DOUBLE

x birden çok kez başvurulurken, later bir kez başvurulur.

SQL

> DECLARE stmtStr = 'SELECT current_timestamp() + :later, :x * :x AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS AS later, 15.0 AS x;
  2024-01-19 16:17:16.692303  225.00

Scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark named parameter marker example")
  .getOrCreate()

val argMap = Map("later" -> java.time.Duration.ofHours(3), "x" -> 15.0)
spark.sql(
  sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
  args = argMap).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Java

import org.apache.spark.sql.*;
import static java.util.Map.entry;

SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark named parameter marker example")
  .getOrCreate();

Map<String, String> argMap = Map.ofEntries(
  entry("later", java.time.Duration.ofHours(3)),
  entry("x", 15.0)
);

spark.sql(
  sqlText = "SELECT current_timestamp() + :later, :x * :x AS square",
  args = argMap).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Python

spark.sql("SELECT :x * :y * :z AS volume", args = { "x" : 3, "y" : 4, "z"  : 5 }).show()
// +------+
// |volume|
// +------+
// |    60|
// +------+

Adsız parametre işaretçileri

Şunlar için geçerlidir: Databricks Runtime check marked yes 13.3 ve üzeri

Adsız parametre işaretçileri, yazılan yer tutucu değişkenleridir. SQL deyimini çağıran API, her parametre işaretçisini göründükleri sırada bir değerle ilişkilendirmek için bir dizi bağımsız değişken sağlamalıdır.

Sözdizimi

 ?

Parametreler

  • ?: Soru işareti biçiminde sağlanan parametre işaretçisine başvuru.

Notlar

Adsız parametre işaretçisinin her oluşumu, SQL deyimini sırayla çağıran API tarafından sağlanan bir değeri kullanır. Parametre işaretçisine hiçbir değer bağlanmadıysa, bir UNBOUND_SQL_PARAMETER hatası oluşur. Sağlanan tüm değerleri kullanmanız gerekmez.

Örnekler

Aşağıdaki örnek üç parametre işaretçisini tanımlar:

  • 3 değerine sahip bir INTERVAL HOUR .
  • Her birinin değeri 15,0 olan iki DOUBLE .

Parametreler adlandırılmadığından sağlanan her değer en fazla bir parametre tarafından tüketilir.

SQL

> DECLARE stmtStr = 'SELECT current_timestamp() + ?, ? * ? AS square';
> EXECUTE IMMEDIATE stmtStr USING INTERVAL '3' HOURS, 15.0, 15.0;
  2024-01-19 16:17:16.692303  225.00

Scala

import org.apache.spark.sql.SparkSession

val spark = SparkSession
  .builder()
  .appName("Spark unnamed parameter marker example")
  .getOrCreate()

val argArr = Array(java.time.Duration.ofHours(3), 15.0, 15.0)

spark.sql(
  sqlText = "SELECT current_timestamp() + ?, ? * ? AS square", args = argArr).show()
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Java

import org.apache.spark.sql.*;

SparkSession spark = SparkSession
  .builder()
  .appName("Java Spark unnamed parameter marker example")
  .getOrCreate();

Object[] argArr = new Object[] { java.time.Duration.ofHours(3), 15.0, 15.0 }

spark.sql(
  sqlText = "SELECT current_timestamp() + ?, ? * ? AS square",
  args = argArr).show();
// +----------------------------------------+------+
// |current_timestamp() + INTERVAL '03' HOUR|square|
// +----------------------------------------+------+
// |                    2023-02-27 17:48:...|225.00|
// +----------------------------------------+------+

Python

spark.sql("SELECT ? * ? * ? AS volume", args = { 3, 4, 5 }).show()
// +------+
// |volume|
// +------+
// |    60|
// +------+