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łę.