# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
# ---

# # Como fazer joins no pyspark
#
# Para uma explicação melhor acessar [esse link](https://www.datasciencemadesimple.com/join-in-pyspark-merge-inner-outer-right-left-join-in-pyspark/)

# ## Inner join
#
# Obtem a intersecção dos dois datasets
#
# ```python
# ### Inner join in pyspark
# df_inner = df1.join(df2, on=['Roll_No'], how='inner')
# ```
#

# ## Outer join
#
# Entenda como o full outer (traz tudo dos dois datasets)
#
# ```python
# ### Outer join in pyspark
# df_outer = df1.join(df2, on=['Roll_No'], how='outer')
# ```

# ## Left join
#
# Ou left outer join
#
# ```python
# ### Left join in pyspark
# df_left = df1.join(df2, on=['Roll_No'], how='left')
# ```

# ## Right join
#
# Ou right outer join
#
# ```python
# ### Right join in pyspark
# df_right = df1.join(df2, on=['Roll_No'], how='right')
# ```

# ## Left Anti join
#
# Esse traz tudo de df1 que não tem correspondente em df2
#
# ```python
# ### Left Anti join in pyspark
# df_left_anti = df1.join(df2, on=['Roll_No'], how='left_anti')
#
# ```

# ## Left semi join
#
# Ver [aqui](https://stackoverflow.com/questions/21738784/difference-between-inner-join-and-left-semi-join#21738897) para uma excelente explicação mas resumindo,
# é equivalente ao "SELECT ... WHERE EXISTS (...)" retorna apenas cada uma das linhas do dataset da esquerda que existirem correspondentes no da direita, retorna apenas uma linha por intersecção mesmo que o dataset da direita tenha mais combinações. Também só pode retornar campos do dataset da esquerda. O inner join em comparação retornaria uma linha para cada intersecção entre esquerda e direta.
#
# ```python
# df_left_semi = df1.join(df2, on=['Roll_No'], how='left_semi')
# ```
#
# Equivalentes:
# ```sql
# SELECT name
# FROM table_1 a
#     LEFT SEMI JOIN table_2 b ON (a.name=b.name)
#
#
# SELECT name
# FROM table_1 a
# WHERE EXISTS(
#     SELECT * FROM table_2 b WHERE (a.name=b.name))
# ```

# ## Full join
# Traz tudo existente tanto da esquerda quanto da direita e as intersecções como uma unica linha. Sera a união do INNER, LEFT OUTER e "RIGHT OUTER"
#
# ```python
# ### Outer join in pyspark
# df_outer = df1.join(df2, on=['Roll_No'], how='full')
# ```

# ## Anti join
# Pela descrição é igual a left anti.
#
# ```python
# ### Outer join in pyspark
# df_anti = df1.join(df2, on=['Roll_No'], how='anti')
# ```
#
#

StarcoderdataJupyterScriptsDedupFiltered