Databricks: IllegalStateException
Problem:
Odpytując tabelę w Databricks dostajesz błąd:
Error in SQL statement: IllegalStateException: Couldn't find description#1350 in [id#1348,name#1349]
com.databricks.backend.common.rpc.SparkDriverExceptions$SQLExecutionException: java.lang.IllegalStateException: Couldn't find description#1350 in [id#1348,name#1349]
Rozwiązanie:
Jedna z kolumn, które odpytujesz ma typ void. Dwie możliwości, naprawy:
- Unikać w zapytaniu kolumn, które mają typ void i wybierać w zapytaniu tylko te kolumny, który mają zdefiniowany typ inny niż void.
- Zdefiniować tabelę na nowo i zamiast typu void wstawić oczekiwany typ.
Pierwsza z propozycji jest tymczasowa i nie rozwiązuje problemu tylko umożliwia jego pominięcie. Druga propozycja rozwiązuje problem i to jest rekomendowane rozwiązanie.
Databricks: IllegalStateException - Przypadek testowy
Przygotujemy sobie pole do działania. Prosta tabela posiadająca jeden rekord i trzy kolumny:
create table nextlevel_dm.next_level_test as
select 1 as id,
'Next Level Name' as name,
null as description
Nie definiujemy typów danych dla tych kolumn. W tym przypadku Spark sam zgaduje typy danych. Dla pierwszej prawidłowo odczyta go jako integer. Dla drugiej kolumny będzie to string a dla trzeciej?
Odpytanie tabeli w ten sposób:
select * from nextlevel_dm.next_level_test zwróci błąd: IllegalStateException
Databricks: IllegalStateException - Dlaczego to tak działa?
Odpytaj metadane tabeli na przykład w ten sposób:
describe nextlevel_dm.next_level_test
Zobaczysz wtedy, że jedna z kolumn ma typ void
To jest winowajca i sprawca błędu.
Databricks: IllegalStateException - Rozwiązanie tymczasowe
Masz dwie opcje. Pierwsza nie rozwiązuje problemu ale pozwala Ci pracować z danymi.
Select id, name from nextlevel_dm.next_level_test
To zapytanie nie zwróci błędu, ponieważ nie odpytujesz kolumny o niezdefiniowanym typie.
Tylko, że ciągle ta "bomba zegarowa" tyka i Ty, albo inny osobnik z zespołu traficie znowu na ten błąd. Więc może warto nie zamiatać tego problemu pod dywan? W jaki sposób rozwiązać ten problem?
Databricks: IllegalStateException - Rozwiązanie docelowe
Jeżeli masz szczęście możesz usunąć kolumnę (DROP column) i dodać ją na nowo. Tylko, że drop column jest obecnie (2023.07) dostępna w wersji preview.
Nie można też zmienić typu danych kolumny w ten sposób
alter table nextlevel_dm.next_level_test alter column description string
Taka komenda NIE ISTNIEJE.
Zastosowanie konwersji null'a na typ danych rozwiązuje problem. Jedyny minus tego rozwiązania jest taki, że musisz stworzyć tabelę na nowo:
create or replace table nextlevel_dm.next_level_test as
select 1 as id,
'Next Level Name' as name,
cast(null as string) as description
Sprawdźmy jeszcze jakie są typy danych w tabeli:
describe nextlevel_dm.next_level_test
Po konwersji w zapytaniu spark nie ma problemu z określeniem typu danych.
To definitywne rozwiązanie problemu IllegalStateException
Chcesz wiedzieć więcej o typie danych void? Zajrzyj na stronę Databricks:
https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/data-types/null-type