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 melakukanjoinpada 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 874833936Anda dapat secara eksplisit menentukan kondisi
join. Untuk operasijoin, jika nama kolom yang ditentukan dalam kondisionuntuk 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 874833936Untuk jenis operasi
joinlainnya sepertileft 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 874833936Dalam kode sampel sebelumnya, dua kolom
movie_iddiubah namanya menjadimovie_id_xdanmovie_id_y. Aturan penggantian nama tergantung pada parametersuffixes. 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 3Anda juga dapat menentukan ekspresi yang menggunakan operator kesetaraan dalam kondisi
onuntuk 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 3Jika Anda melakukan operasi
self join, Anda dapat memanggil metodeviewuntuk 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%... 4PyODPS DataFrame mendukung operasi
left join,right join, danouter joinselain operasijoin. Dalam operasi left join, right join, dan outer join, kolom yang diubah namanya memiliki akhiran_xatau_ysecara default. Anda dapat menggunakan 2-tupleuntuk menentukan akhiran dalam parametersuffixes.Saat Anda melakukan operasi left join, right join, atau outer join, Anda dapat mengatur parameter
merge_columnske 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.