Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir aralık birleşimi, bir değerin bir aralık içinde olup olmadığını veya iki aralığın örtüşüp örtüşmediğini kontrol eden bir koşulla iki tabloyu birleştirir; iki değerin eşit olup olmadığını kontrol etmek yerine. Örneğin, her web sitesi etkinliğini gerçekleştiği kullanıcı oturumuyla eşleştiren bir sorgu, etkinliğin zaman damgasının oturumun başlangıç ve bitiş saatleri arasında olup olmadığını kontrol eder. Aynı anda planlanan toplantıları bulan bir sorgu, iki zaman aralığının örtüşüp örtüşmediğini kontrol eder. Databricks Runtime'daki aralık birleştirme optimizasyonu, bu sorguların performansını büyük ölçüde artırabilir.
Bu nedenle, bir join eşleşemeyen birçok satır çiftini karşılaştırabilir. Aralık birleştirme optimizasyonu, değer aralığını binlere böler ve yalnızca örtüşen binlere düşen satırları karşılaştırır. Bkz. Bin boyutu.
Databricks SQL'de Azure Databricks, aralık birleştirmelerini el ile yapılandırma olmadan otomatik olarak iyileştirir. Ayrıca tüm işlem türleri için birleştirme ipuçlarını veya oturum yapılandırmasını kullanarak aralık birleştirmelerini el ile ayarlayabilirsiniz.
Aralık aralığı birleştirme noktası
Aralık aralığı birleşimindeki bir nokta, koşulu, bir ilişkiden gelen bir değerin diğer ilişkideki iki değer arasında yer aldığını belirten yüklemler içeren bir birleşimdir. Örneğin:
-- using BETWEEN expressions
SELECT *
FROM points JOIN ranges ON points.p BETWEEN ranges.start and ranges.end;
-- using inequality expressions
SELECT *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.end;
-- with fixed length interval
SELECT *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.start + 100;
-- join two sets of point values within a fixed distance from each other
SELECT *
FROM points1 p1 JOIN points2 p2 ON p1.p >= p2.p - 10 AND p1.p <= p2.p + 10;
-- a range condition together with other join conditions
SELECT *
FROM points, ranges
WHERE points.symbol = ranges.symbol
AND points.p >= ranges.start
AND points.p < ranges.end;
Aralık çakışma aralığı birleştirme
Bir aralık çakışması aralığı birleştirme, koşulun her ilişkideki iki değer arasındaki aralıkların çakışmasını belirten önermeler içerdiği bir birleşimdir. Örneğin:
-- overlap of [r1.start, r1.end] with [r2.start, r2.end]
SELECT *
FROM r1 JOIN r2 ON r1.start < r2.end AND r2.start < r1.end;
-- overlap of fixed length intervals
SELECT *
FROM r1 JOIN r2 ON r1.start < r2.start + 100 AND r2.start < r1.start + 100;
-- a range condition together with other join conditions
SELECT *
FROM r1 JOIN r2 ON r1.symbol = r2.symbol
AND r1.start <= r2.end
AND r1.end >= r2.start;
Aralık birleştirme iyileştirmesi
Aralık join optimizasyonu, aşağıdaki join'ler için geçerlidir:
- Aralıkta bir nokta veya aralık çakışması için bir birleştirme koşulu olsun.
- Aralık birleştirme koşulunda yalnızca sayısal (integral, kayan nokta veya ondalık),
DATEveyaTIMESTAMPdeğerleri kullanın. - Aynı türden değerleri aralık birleştirme koşulunda kullanın. Ondalık değerler de aynı ölçek ve hassasiyete sahip olmalıdır.
- Desteklenen bir birleştirme türü kullanın:
-
INNER JOIN, herhangi bir aralık birleştirmesi için - yalnızca interval range join işlemlerindeki point için, nokta değeri sol taraftaysa
LEFT OUTER JOINveya nokta değeri sağ taraftaysaRIGHT OUTER JOIN
-
- Bölme boyutu ya otomatik olarak türetilmiş ya da manuel olarak belirtilmiş olsun.
Sayısal eşitlik ve aralık koşullarına dayalı birleştirme
Birleştirme koşulu hem sayısal sütunda eşitlik koşulu hem de aralık koşulu içerdiğinde, aralık birleştirme iyileştirmesi için tür gereksinimlerini karşıladığı için iyileştirici sayısal eşitlik sütununa gruplama uygulayabilir. Bu, eşitlik sütununun bölmelere atanması veya iyileştirmenin dışında tutulmasına neden olarak performansı düşürebilir.
Aralık birleştirme optimizasyonunun yalnızca amaçlanan aralık koşuluna uygulanmasını sağlamak için sayısal eşitlik sütunlarını STRING türüne dönüştürün. Bu, bunların aralık koşulu sütunları olarak değerlendirmeye alınmasını engeller.
SELECT /*+ RANGE_JOIN(reference, 3306084) */
reference.*, position.*
FROM position
INNER JOIN reference
ON CAST(position.parent_index AS STRING) = CAST(reference.parent_index AS STRING)
AND position.child_index BETWEEN reference.min_child_index AND reference.max_child_index;
Aynı desen, eşitlik anahtarları olarak kullanılan , tamsayı tanımlayıcıları veya kümelenmiş bölüm sütunları gibi DATEdiğer sayısal sütunlar için de geçerlidir.
Kutu boyutu
kutu boyutu, aralık koşulunun değer etki alanını eşit boyutta birden çok kutuya bölen sayısal bir ayar parametresidir. Örneğin, bölme boyutu 10 olan iyileştirme, etki alanını uzunluk 10 aralıkları olan bölmelere böler.
aralık koşulunda p BETWEEN start AND endbir noktanız varsa ve 8 ve startend 22 ise, bu değer aralığı 10 uzunluklu üç bölmeyle çakışıyor: 0'dan 10'a ilk bölme, 10'dan 20'ye ikinci bölme ve 20'den 30'a üçüncü bölme. Yalnızca aynı üç kategorideki noktalar bu aralıkta muhtemel birleştirme eşleşmeleri olarak değerlendirilmelidir. 32, p 30 ile 40 arasındaki bir bölmede yer aldığından dolayı, start 8 ile end 22 arasında olmadığından elenebilir.
Not
-
DATEdeğerleri için, bölme boyutunun değeri gün olarak değerlendirilir. Örneğin, 7 bölme boyutu değeri bir haftayı temsil eder. -
TIMESTAMPdeğerleri için, bölme boyutunun değeri saniye cinsinden değerlendirilmektedir. Bir saniyeden küçük bir değer için kesirli bir değer kullanın. Örneğin, 60 bölme boyutu değeri bir dakikayı, 0,1 bölme boyutu değeri ise 100 milisaniyeyi temsil eder.
Sorguda bir aralık birleştirme ipucu kullanarak veya bir oturum yapılandırma parametresi belirleyerek bölme boyutunu belirtebilirsiniz. Databricks SQL'de, otomatik aralık birleştirme iyileştirmesi etkinleştirildiğinde kutu boyutu otomatik olarak belirlenir.
Otomatik aralık birleştirme optimizasyonu
Databricks SQL'de Azure Databricks uygun aralık birleşimlerini otomatik olarak algılar ve aralıklar tablosunu örnekleme yoluyla en uygun bölme boyutunu türetir. Bu, ipuçları veya oturum yapılandırması aracılığıyla bölme boyutunu el ile belirtme gereksinimini ortadan kaldırır.
Databricks SQL'de otomatik aralık birleştirme iyileştirmesi varsayılan olarak etkindir. Devre dışı bırakmak için şu yapılandırmayı ayarlayın:
SET spark.databricks.optimizer.autoRangeJoin.enabled = false;
Aralık birleştirme ipucu veya oturum yapılandırması aracılığıyla bir bölme boyutu belirtirseniz, bu değer otomatik olarak belirlenen bölme boyutunu geçersiz kılar.
Aralık birleştirme ipucu kullanarak aralık birleştirmeyi etkinleştirin
Bir SQL sorgusunda aralık birleştirme iyileştirmesini etkinleştirmek için, kutu boyutunu belirtmek üzere aralık birleştirme yönergesi kullanın. İpucu, birleştirilmiş ilişkilerden birinin ilişki adını ve sayısal bölme boyutu parametresini içermelidir. İlişki adı bir tablo, bir görünüm veya alt sorgudur.
SELECT /*+ RANGE_JOIN(points, 10) */ *
FROM points JOIN ranges ON points.p >= ranges.start AND points.p < ranges.end;
SELECT /*+ RANGE_JOIN(r1, 0.1) */ *
FROM (SELECT * FROM ranges WHERE ranges.amount < 100) r1, ranges r2
WHERE r1.start < r2.start + 100 AND r2.start < r1.start + 100;
SELECT /*+ RANGE_JOIN(c, 500) */ *
FROM a
JOIN b ON (a.b_key = b.id)
JOIN c ON (a.ts BETWEEN c.start_time AND c.end_time)
Not
Üçüncü örnekte ipucu yerleştirilmelidir üzerine.
Bunun nedeni birleşimlerin ilişkilendirici olarak bırakılmasıdır; bu nedenle sorgu (a JOIN b) JOIN colarak yorumlanır ve a ipucu aile birleştirme değil b ile c birleşimi için geçerlidir.
#create minute table
minutes = spark.createDataFrame(
[(0, 60), (60, 120)],
"minute_start: int, minute_end: int"
)
#create events table
events = spark.createDataFrame(
[(12, 33), (0, 120), (33, 72), (65, 178)],
"event_start: int, event_end: int"
)
#Range_Join with "hint" on the from table
(events.hint("range_join", 60)
.join(minutes,
on=[events.event_start < minutes.minute_end,
minutes.minute_start < events.event_end])
.orderBy(events.event_start,
events.event_end,
minutes.minute_start)
.show()
)
#Range_Join with "hint" on the join table
(events.join(minutes.hint("range_join", 60),
on=[events.event_start < minutes.minute_end,
minutes.minute_start < events.event_end])
.orderBy(events.event_start,
events.event_end,
minutes.minute_start)
.show()
)
Ayrıca, birleştirilmiş DataFrame'lerden birine bir aralık birleştirme ipucu yerleştirebilirsiniz. Bu durumda, ipucu yalnızca sayısal bölme boyutu parametresini içerir.
val df1 = spark.table("ranges").as("left")
val df2 = spark.table("ranges").as("right")
val joined = df1.hint("range_join", 10)
.join(df2, $"left.type" === $"right.type" &&
$"left.end" > $"right.start" &&
$"left.start" < $"right.end")
val joined2 = df1
.join(df2.hint("range_join", 0.5), $"left.type" === $"right.type" &&
$"left.end" > $"right.start" &&
$"left.start" < $"right.end")
Oturum yapılandırmasını kullanarak aralık birleştirmeyi etkinleştirme
Sorguyu değiştirmek istemiyorsanız, bölme boyutunu yapılandırma parametresi olarak belirtin.
SET spark.databricks.optimizer.rangeJoin.binSize=5
Bu yapılandırma parametresi, aralık koşulu olan tüm birleşimler için geçerlidir. Ancak, aralık birleştirme ipucu aracılığıyla ayarlanan farklı bir bölme boyutu her zaman parametresi aracılığıyla ayarlananı geçersiz kılar.
Kutu boyutunu seçin
Aralık birleştirme optimizasyonunun etkinliği, uygun bölme boyutunun seçilmesine bağlıdır.
Küçük bir bölme boyutu, olası eşleşmelerin filtrelenmesine yardımcı olan daha fazla sayıda bölmeye neden olur.
Küçük bir bin boyutu, değer aralıkları bin boyutundan çok daha büyükse verimsiz hale gelir ve aralıkların birçok binle örtüşmesine neden olur. Örneğin, start değerinin 1.000.000 ve end değerinin 1.999.999 olduğu bir p BETWEEN start AND end koşuluyla ve bin boyutu 10 olduğunda, aralık 100.000 binle örtüşür.
Aralık uzunluğu oldukça eşit ve biliniyorsa, kutu boyutunu tipik aralık uzunluğuna ayarlayın. Değişken, çarpık aralıklar için, kısa aralıkları verimli şekilde filtreleyen ve uzun aralıkların çok fazla binle çakışmasını engelleyen bir bin boyutu seçin. Sütunlar start ve end arasında aralıklar olan bir tablo ranges için, çarpık aralık uzunluğunun yüzdeliklerini bu sorguyla belirleyin:
SELECT
map_from_arrays(
ARRAY(0.5, 0.9, 0.99, 0.999, 0.9999),
APPROX_PERCENTILE(
end::DOUBLE - start::DOUBLE,
ARRAY(0.5, 0.9, 0.99, 0.999, 0.9999)
)
) AS bin_sizes
FROM
ranges;
Çıkarma işleminden önce her sütunun DOUBLE türüne dönüştürülmesi, sütunlar sayısal, DATE veya TIMESTAMP değerler içerse de sorgunun çalışmasını sağlar.
Kutu boyutunu bu değerlerin en büyüğüne ayarlayın:
- Aralık uzunluklarının 90. yüzdeliği. Bu büyüklükte, aralıkların en fazla %10'u 2'den fazla kutuyu kapsar.
- 99. yüzdelik dilim 10'a bölünmüştür. Bu büyüklükte, aralıkların en fazla %1'i 11'den fazla kutuyu kapsar.
- 99,9'luk yüzdelik dilimin 100'e bölünmesi. Bu büyüklükte, aralıkların en fazla %0,1’i 101’den fazla kutuyu kapsar.
Daha da uzun aralıkları sınırlamak için, bu örüntüyü 99.99. ve 99.999. yüzdeliklerle sürdürün. Sonucu başlangıç noktası olarak kullanın ve ardından iş yükünüze göre bin boyutunu ayarlayın.