INVALID_ARRAY_INDEX_IN_ELEMENT_AT-Fehlerklasse
Der Index <indexValue>
liegt außerhalb der Begrenzung. Das Array enthält <arraySize>
Elemente. Verwenden Sie try_element_at
, um den Zugriff auf ein Element mit ungültigem Index zu tolerieren und stattdessen NULL zurückzugeben. Legen Sie <ansiConfig>
bei Bedarf auf „false“ fest, um diesen Fehler zu umgehen.
Parameter
- indexValue: Der angeforderte Index im Array.
- arraySize: Die Kardinalität des Arrays.
- ansiConfig: Die Konfigurationseinstellung zur Änderung des ANSI-Modus.
Erklärung
indexValue
liegt außerhalb der Grenze der definierten Arrayelemente für den Ausdruck element_at(arrayExpr, indexValue) oder elt(arrayExpr, indexValue).
Der Wert muss zwischen -arraySize
und arraySize
liegen, ausgenommen 0
.
Lösung
Die Entschärfung dieses Fehlers hängt von der Ursache ab:
Ist die Kardinalität des Arrays kleiner als erwartet?
Korrigieren Sie das Eingabearray, und führen Sie die Abfrage erneut aus.
Wurde
indexValue
falsch berechnet?Passen Sie
indexValue
an, und führen Sie die Abfrage erneut aus.Erwarten Sie, dass Sie für Elemente außerhalb der Kardinalität des Index einen
NULL
-Wert zurückbekommen?Wenn Sie den Ausdruck ändern können, verwenden Sie try_element_at(arrayExpr, indexValue), um Verweise außerhalb der Begrenzung zu tolerieren.
Wenn Sie den Ausdruck nicht ändern können, setzen Sie
ansiConfig
als letzten Ausweg vorübergehend auffalse
fest, um Verweise außerhalb der Begrenzung zu tolerieren.
Beispiele
-- 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;