Problem:
Migrujemy kod z SQL do pyspark. Nie chcemy używać pyspark sql ale rzeczywiście użyć kodu napisanego w Sparku. Czy są polecenia, które inaczej działają w Spark i SQL? Mają taką samą składnie a zupełnie inne działanie? W jaki sposób sprawić, żeby zachować tą oczekiwaną funkcjonalność po migracji? Jako przykład weźmy union, union all w SQL'u i Sparku.
Rozwiązanie:
Dla przypomnienia, union w SQL łączy zbiory i usuwa duplikaty. Union all tylko łączy zbiory, bez usuwania duplikatów. W Sparku union tylko łączy zbiory ale nie usuwa duplikatów. W Sparku union all to alias do funkcji union.
Jeżeli w SQL masz funkcję union i chcesz również w pysparku deduplikować zbiór danych wtedy zastosuj:
df1.union(df2).distinct()
Dodatkowo spark posiada też funkcję unionByName, która może być bardzo użyteczna w niektórych przypadkach. Łączy ona dwa zbiory wykorzystując nazwy kolumn a nie pozycje. Dopuszcza też, żeby oba zbiory miały różną liczbę kolumn. W przypadku gdy liczność jest różna, wtedy brakujące kolumny wypełnia nullami.