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:

  1. Unikać w zapytaniu kolumn, które mają typ void i wybierać w zapytaniu tylko te kolumny, który mają zdefiniowany typ inny niż void.
  2. 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

Databricks Illegal State Exception

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

Databricks Illegal State Exception

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