全部产品
Search
文档中心

MaxCompute:Gabungkan data

更新时间:Jul 02, 2025

Topik ini menjelaskan operasi join dan union yang didukung oleh Alibaba Cloud MaxCompute SDK untuk Python (PyODPS) DataFrame dalam menggabungkan data di tabel.

Prasyarat

Data tabel telah diimpor. Anda dapat mengunduh data sesuai dengan petunjuk di bagian "Persiapkan data" dalam Memulai. Kode berikut menunjukkan struktur tabel.

>>> from odps.df import DataFrame
>>> movies = DataFrame(o.get_table('pyodps_ml_100k_movies'))
>>> ratings = DataFrame(o.get_table('pyodps_ml_100k_ratings'))

>>> 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
}

Operasi Join

PyODPS DataFrame memungkinkan Anda untuk melakukan join pada dua objek Collection.

  • Jika Anda tidak menentukan kondisi join, API DataFrame menggunakan kolom dengan nama yang sama untuk melakukan join pada objek Collection.

    >>> 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
  • Anda dapat secara eksplisit menentukan kondisi join. Untuk operasi join, jika nama kolom yang ditentukan dalam kondisi on untuk dua objek DataFrame sama, sistem akan menggunakan kolom yang ditentukan di salah satu dari dua tabel untuk tabel baru.

    >>> 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
  • Untuk jenis operasi join lainnya seperti left join, jika nama kolom yang ditentukan dalam kondisi on untuk dua objek Collection sama, sistem akan mengubah nama kolom yang ditentukan untuk tabel baru.

    >>> 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

    Dalam kode sampel sebelumnya, dua kolom movie_id diubah namanya menjadi movie_id_x dan movie_id_y. Aturan penggantian nama tergantung pada parameter suffixes. Nilai default dari parameter suffixes adalah ('_x', '_y'). Ketika kolom dengan nama yang sama ditemukan, sistem mengganti nama kolom menggunakan akhiran yang ditentukan.

    >>> 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
  • Anda juga dapat menentukan ekspresi yang menggunakan operator kesetaraan dalam kondisi on untuk mengganti nama kolom untuk tabel baru.

    >>> 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
  • Jika Anda melakukan operasi self join, Anda dapat memanggil metode view untuk mengambil kolom dari tabel kiri dan kanan.

    >>> 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

    PyODPS DataFrame mendukung operasi left join, right join, dan outer join selain operasi join. Dalam operasi left join, right join, dan outer join, kolom yang diubah namanya memiliki akhiran _x atau _y secara default. Anda dapat menggunakan 2-tuple untuk menentukan akhiran dalam parameter suffixes.

  • Saat Anda melakukan operasi left join, right join, atau outer join, Anda dapat mengatur parameter merge_columns ke True untuk mencegah kolom duplikat dalam tabel baru. Sistem kemudian memilih nilai non-null dari kolom duplikat sebagai nilai dalam kolom baru.

    >>> movies.left_join(ratings, on='movie_id', merge_columns=True)

Jika Anda ingin melakukan operasi mapjoin, atur mapjoin ke True. Sistem kemudian akan melakukan operasi mapjoin pada tabel kanan. Anda dapat secara terpisah melakukan operasi join pada koleksi PyODPS dan Pandas. Anda juga dapat secara terpisah melakukan operasi join pada koleksi PyODPS dan database. Dalam hal ini, perhitungan dilakukan pada PyODPS.

Operasi Union

Jika bidang dan tipe bidang dari dua tabel sama, Anda dapat menggunakan union atau concat untuk menggabungkan dua tabel menjadi satu tabel, terlepas dari apakah urutan bidang dalam dua tabel sama.

>>> 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)

Anda dapat secara terpisah melakukan operasi union pada koleksi PyODPS dan Pandas. Anda juga dapat secara terpisah melakukan operasi union pada koleksi PyODPS dan database. Dalam hal ini, perhitungan dilakukan pada PyODPS.