Problem:

Wygenerować dodatkowe wiersze w tabeli na podstawie wartości liczbowej. Wartość liczbowa określa ile wierszy ma być wygenerowanych. Wartość liczbowa zawsze istnieje i przyjmuje wartości od 1 do 10. Dla 1 mają nie być generowane nowe wiersze. Dla 2 mają zostać wygenerowane dwa wiersze, dla trójki trzy wiersze itd.

Rozwiązanie:

Użycie funkcji explode. Przyjmuje ona jako argument tablicę albo mapę. W naszym przypadku stworzymy listę. Będzie ona miała wartości od 1 do n. Gdzie n będzie wartością liczbową z tabeli. Do wygenerowania listy wartości użyjemy funkcji sequence.
Pseudo kod do rozwiązania będzie wyglądał w ten sposób:

explode(sequence(1, quantity, 1))

Zastosowanie explode w praktyce

Dane wejściowe wyglądają w ten sposób.

Dla pierwszego rekordu trzeba wygenerować 1 dodatkowy wiersz. Czyli będą istniały dwa wiersze z itemid 1359023. Dla rekordu drugiego potrzeba trzech wierszy, czyli będą istniały 4 wiersze z itemid 1930373.

select itemid, explode(sequence(1, quantity, 1)) as item_no, quantity as out_of_total, status from next_level_dm.ds_item

Całą "robotę" bierze na siebie funkcja explode, która generuje oczekiwaną liczbę wierszy:

explode(sequence(1, quantity, 1))

Wewnętrzna sekwencja generuje listę elementów od jednego do quantity, co jeden element. Czyli dla quantity 4 wygenerowany zostanie array[1, 2, 3, 4]

Explode dla wartości znakowych

Użycie funkcji explode nie jest ograniczone tylko do wartości liczbowych. Z powodzeniem zastosujesz explode gdy masz listę ciągów znaków, na przykład statusów:

select itemid, explode(status_history) as status from next_level_dm.ds_status_history

Explode błędy

Gdybyś chciał użyć explode bez podawania listy, podasz tylko wartość jako parametr:

select itemid, explode(quantity) as item_no, quantity as out_of_total, status from next_level_dm.ds_item

Wtedy dostaniesz taki błąd.

AnalysisException: [DATATYPE_MISMATCH.UNEXPECTED_INPUT_TYPE] Cannot resolve "explode(quantity)" due to data type mismatch: Parameter 1 requires the ("ARRAY" or "MAP") type, however "quantity" has the type "BIGINT"

Dodanie sekwencji w funkcji explode tworzy właściwą formułę.