INVALID_ARRAY_INDEX_IN_ELEMENT_AT hata sınıfı
Dizin <indexValue>
sınırların dışında. Dizinin öğeleri vardır <arraySize>
. Geçersiz dizindeki öğeye erişimi tolere etmek ve bunun yerine NULL döndürmek için kullanın try_element_at
. Gerekirse bu hatayı atlamak için "false" olarak ayarlayın <ansiConfig>
.
Parametre
- indexValue: Dizide istenen dizin.
- arraySize: Dizinin kardinalitesi.
- ansiConfig: ANSI modunu değiştirmek için yapılandırma ayarı.
Açıklama
indexValue
bir element_at(arrayExpr, indexValue)veya elt(arrayExpr, indexValue) ifadesi için tanımlı dizi öğelerinin sınırının ötesindedir.
değeri ile arasında -arraySize
arraySize
olmalıdır ve hariç 0
olmalıdır.
Azaltma
Bu hatanın hafifletilmesi nedene bağlıdır:
Dizinin kardinalitesi beklenenden küçük mü?
Giriş dizisini düzeltin ve sorguyu yeniden çalıştırın.
Yanlış hesaplandı mı
indexValue
?Sorguyu ayarlayın
indexValue
ve yeniden çalıştırın.Dizinin kardinalitesi dışındaki öğeler için döndürülecek bir
NULL
değer almayı bekliyor musunuz?İfadeyi değiştirebiliyorsanız, try_element_at (arrayExpr, indexValue) kullanarak başvuruları sınır dışı olarak kabul edin.
İfadeyi değiştiremiyorsanız, son çare olarak öğesini geçici olarak başvurulara izin veremeyecek şekilde
false
ayarlayınansiConfig
.
Örnekler
-- An INVALID_ARRAY_INDEX_IN_ELEMENT_AT error because of mismatched indexing
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
[INVALID_ARRAY_INDEX_IN_ELEMENT_AT] The index 4 is out of bounds. The array has 3 elements. If necessary set "ANSI_MODE" to false to bypass this error.
-- Increase the aray size to cover the index
> SELECT element_at(array('a', 'b', 'c', 'd'), index) FROM VALUES(1), (4) AS T(index);
a
d
-- Adjusting the index to match the array
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (3) AS T(index);
a
c
-- Tolerating out of bound array index with adjustment to 1-based indexing
> SELECT try_element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
-- Tolerating out of bound by setting ansiConfig in Databricks SQL
> SET ANSI_MODE = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
> SET ANSI_MODE = true;
-- Tolerating out of bound by setting ansiConfig in Databricks Runtime
> SET spark.sql.ansi.enabled = false;
> SELECT element_at(array('a', 'b', 'c'), index) FROM VALUES(1), (4) AS T(index);
a
NULL
> SET spark.sql.ansi.enabled = true;