Todos os produtos
Search
Central de documentação

MaxCompute:Mesclar dados

Última atualização: Jun 26, 2026

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

join

Realiza inner join entre duas Collections com base em valores de colunas correspondentes

left_join, right_join, outer_join

Executa outer joins; colunas duplicadas são renomeadas com sufixos

Self join

Une uma Collection a ela mesma usando view()

mapjoin

Efetua uma operação mapjoin na tabela da direita

union / concat

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 movies e ratings conforme 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. Para left_join , right_join e outer_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.