O PyODPS DataFrame permite combinar tabelas usando as operações join e union. Use join para corresponder linhas entre duas Collections com base em uma chave compartilhada; use union ou concat para empilhar duas Collections com o mesmo schema em uma única estrutura.
Operações abordadas nesta página:
|
Operação |
Descrição |
|
|
Realiza inner join entre duas Collections com base em valores de colunas correspondentes |
|
|
Executa outer joins; colunas duplicadas são renomeadas com sufixos |
|
Self join |
Une uma Collection a ela mesma usando |
|
|
Efetua uma operação mapjoin na tabela da direita |
|
|
Empilha duas Collections com schemas compatíveis em uma só |
Pré-requisitos
Antes de começar, verifique se você:
Importou as tabelas de exemplo para o MaxCompute. Siga a seção "Prepare data" em Guia de introdução
Inicializou os DataFrames
movieseratingsconforme mostrado abaixo
from odps.df import DataFrame
movies = DataFrame(o.get_table('pyodps_ml_100k_movies'))
ratings = DataFrame(o.get_table('pyodps_ml_100k_ratings'))
As duas tabelas possuem os seguintes schemas:
>>> movies.dtypes
odps.Schema {
movie_id int64
title string
release_date string
video_release_date string
_url string
}
>>> ratings.dtypes
odps.Schema {
user_id int64
movie_id int64
rating int64
unix_timestamp int64
}
Operações de join
O PyODPS DataFrame une dois objetos Collection e retorna uma nova Collection. O tipo de join e a forma como você escreve a condição determinam como os nomes de colunas duplicadas aparecem no resultado.
Inner join em colunas com o mesmo nome
Para um inner join (join), passe o nome da coluna compartilhada como string para on. O resultado mantém apenas uma cópia da coluna de junção:
>>> movies.join(ratings, on='movie_id').head(3)
movie_id title release_date video_release_date url user_id rating unix_timestamp
0 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 49 3 888068877
1 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 621 5 881444887
2 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 291 3 874833936
Omitir completamente o parâmetro on produz o mesmo efeito — o PyODPS faz automaticamente o join em todas as colunas que compartilham o mesmo nome:
>>> movies.join(ratings).head(3)
movie_id title release_date video_release_date url user_id rating unix_timestamp
0 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 49 3 888068877
1 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 621 5 881444887
2 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 291 3 874833936
Esse comportamento de cópia única aplica-se apenas a inner joins. Paraleft_join,right_joineouter_join, colunas duplicadas são sempre renomeadas com sufixos. Consulte Outer joins .
Join em colunas com nomes diferentes
Quando a chave de join tem nomes diferentes em cada tabela, passe uma lista de tuplas (left_col, right_col) para on:
>>> ratings2 = ratings[ratings.exclude('movie_id'), ratings.movie_id.rename('movie_id2')]
>>> ratings2.dtypes
odps.Schema {
user_id int64
rating int64
unix_timestamp int64
movie_id2 int64
}
>>> movies.join(ratings2, on=[('movie_id', 'movie_id2')]).head(3)
movie_id title release_date video_release_date url user_id rating unix_timestamp movie_id2
0 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 49 3 888068877 3
1 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 621 5 881444887 3
2 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 291 3 874833936 3
Também é possível passar diretamente uma expressão de igualdade — o resultado será idêntico:
>>> movies.join(ratings2, on=[movies.movie_id == ratings2.movie_id2]).head(3)
movie_id title release_date video_release_date url user_id rating unix_timestamp movie_id2
0 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 49 3 888068877 3
1 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 621 5 881444887 3
2 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 291 3 874833936 3
Outer joins
Em operações left_join, right_join e outer_join, o PyODPS sempre renomeia colunas duplicadas com sufixos para preservar ambos os valores. Os sufixos padrão são _x (tabela da esquerda) e _y (tabela da direita):
>>> movies.left_join(ratings, on='movie_id').head(3)
movie_id_x title release_date video_release_date url user_id movie_id_y rating unix_timestamp
0 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 49 3 3 888068877
1 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 621 3 5 881444887
2 3 Four Rooms (1995) 01-Jan-1995 http://example.aliyundoc.com/M/title-exact?Four%20Rooms%... 291 3 3 874833936
Como movie_id aparece em ambas as tabelas, o resultado contém movie_id_x (de movies) e movie_id_y (de ratings).
Sufixos personalizados: Passe uma tupla com dois elementos para suffixes a fim de substituir os padrões:
movies.left_join(ratings, on='movie_id', suffixes=('_movie', '_rating'))
Suprimir colunas duplicadas: Defina merge_columns=True para manter apenas uma cópia de cada coluna duplicada. O PyODPS seleciona o valor não nulo de qualquer um dos lados:
movies.left_join(ratings, on='movie_id', merge_columns=True)
Self join
Para unir uma Collection a ela mesma, crie primeiro uma view com view() para que o PyODPS possa distinguir os lados esquerdo e direito:
>>> movies2 = movies.view()
>>> movies.join(movies2, movies.movie_id == movies2.movie_id)[movies, movies2.movie_id.rename('movie_id2')].head(3)
movie_id title_x release_date_x video_release_date_x \
0 2 GoldenEye (1995) 01-Jan-1995 True
1 3 Four Rooms (1995) 01-Jan-1995 True
2 4 Get Shorty (1995) 01-Jan-1995 True
url_x movie_id2
0 http://example.aliyundoc.com/M/title-exact?GoldenEye%20(... 2
1 http://example.aliyundoc.comtitle-exact?Four%20Rooms%... 3
2 http://example.aliyundoc.com/M/title-exact?Get%20Shorty%... 4
Map join
Para executar uma operação mapjoin, defina mapjoin como True. O sistema então realiza a operação mapjoin na tabela da direita:
movies.join(ratings, on='movie_id', mapjoin=True)
O PyODPS também suporta join entre uma Collection do PyODPS e um DataFrame do pandas ou uma Collection de banco de dados. Nesse caso, o join é executado no PyODPS.
Operações de union
Use union ou concat para empilhar duas tabelas verticalmente em uma só. Ambas devem ter os mesmos nomes de colunas e tipos de dados. A ordem das colunas não precisa ser igual — o PyODPS alinha as colunas pelo nome:
>>> mov1 = movies[movies.movie_id < 3]['movie_id', 'title']
>>> mov2 = movies[(movies.movie_id > 3) & (movies.movie_id < 6)]['title', 'movie_id']
>>> mov1.union(mov2)
movie_id title
0 1 Toy Story (1995)
1 2 GoldenEye (1995)
2 4 Get Shorty (1995)
3 5 Copycat (1995)
O PyODPS também suporta union entre uma Collection do PyODPS e um DataFrame do pandas ou uma Collection de banco de dados. Nessa situação, a operação é executada no PyODPS.