全部产品
Search
文档中心

MaxCompute:Memulai

更新时间:Jul 02, 2025

Topik ini menjelaskan cara membuat dan mengelola objek DataFrame serta cara menggunakan DataFrame untuk memproses data.

Menyiapkan data

Topik ini menggunakan u.user, u.item, dan u.data sebagai contoh. File u.user berisi data pengguna, file u.item berisi data film, dan file u.data berisi data peringkat.

  1. Buat tabel berikut:

    • pyodps_ml_100k_users: menyimpan data pengguna.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_users
      (
        user_id    BIGINT COMMENT 'User ID',
        age        BIGINT COMMENT 'Usia',
        sex        STRING COMMENT 'Jenis kelamin',
        occupation STRING COMMENT 'Pekerjaan',
        zip_code   STRING COMMENT 'Kode pos'
      );
    • pyodps_ml_100k_movies: menyimpan data film.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_movies
      (
          movie_id            BIGINT COMMENT 'Movie ID',
          title              STRING COMMENT 'Judul film',
          release_date       STRING COMMENT 'Tanggal rilis',
          video_release_date STRING COMMENT 'Tanggal rilis video',
          IMDb_URL           STRING COMMENT 'IMDb URL',
          unknown            TINYINT COMMENT 'Tidak diketahui',
          Action             TINYINT COMMENT 'Aksi',
          Adventure          TINYINT COMMENT 'Petualangan',
          Animation          TINYINT COMMENT 'Animasi',
          Children           TINYINT COMMENT 'Anak-anak',
          Comedy             TINYINT COMMENT 'Komedi',
          Crime              TINYINT COMMENT 'Kejahatan',
          Documentary        TINYINT COMMENT 'Dokumenter',
          Drama              TINYINT COMMENT 'Drama',
          Fantasy            TINYINT COMMENT 'Fantasi',
          FilmNoir           TINYINT COMMENT 'Film noir',
          Horror             TINYINT COMMENT 'Horor',
          Musical            TINYINT COMMENT 'Musik',
          Mystery            TINYINT COMMENT 'Misteri',
          Romance            TINYINT COMMENT 'Romansa',
          SciFi              TINYINT COMMENT 'Fiksi ilmiah',
          Thriller           TINYINT COMMENT 'Thriller',
          War                TINYINT COMMENT 'Perang',
          Western            TINYINT COMMENT 'Barat'
      );
    • pyodps_ml_100k_ratings: menyimpan data peringkat.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_ratings
      (
          user_id    BIGINT COMMENT 'User ID',
          movie_id  BIGINT COMMENT 'Movie ID',
          rating    BIGINT COMMENT 'Skor',
          timestamp BIGINT COMMENT 'Timestamp'
      )
  2. Jalankan perintah Tunnel upload untuk mengimpor data dari file ke tabel MaxCompute. Untuk informasi lebih lanjut tentang perintah Tunnel, lihat Perintah Tunnel.

    Tunnel upload -fd | path_to_file/u.user pyodps_ml_100k_users;
    Tunnel upload -fd | path_to_file/u.item pyodps_ml_100k_movies;
    Tunnel upload -fd | path_to_file/u.data pyodps_ml_100k_ratings;

Perform operations on DataFrame objects

Dalam topik ini, digunakan tabel berikut: pyodps_ml_100k_movies (data film), pyodps_ml_100k_users (data pengguna), dan pyodps_ml_100k_ratings (data peringkat). Contoh berikut menunjukkan cara melakukan operasi pada tabel-tabel ini di IPython.

Catatan

Sebelum menggunakan IPython, pastikan Python sudah terinstal. IPython dikembangkan berdasarkan Python, sehingga Anda harus menginstal lingkungan Python terlebih dahulu. Setelah itu, instal IPython dengan perintah pip install IPython. Setelah instalasi selesai, jalankan perintah IPython untuk memulai lingkungan interaktif berbasis IPython dan mulai menulis kode Python.

  1. Buat objek MaxCompute.

    import os
    from odps import ODPS
    # Atur variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID ke ID AccessKey akun Alibaba Cloud Anda.
    # Atur variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET ke Rahasia AccessKey akun Alibaba Cloud.
    # Kami merekomendasikan agar Anda tidak langsung menggunakan ID AccessKey atau Rahasia AccessKey Anda.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    
  2. Buat objek DataFrame dengan menentukan tabel.

    from odps.df import DataFrame
    users = DataFrame(o.get_table('pyodps_ml_100k_users'));
  3. Kueri properti dtypes untuk melihat bidang objek DataFrame beserta tipe datanya.

    print(users.dtypes)

    Hasil berikut dikembalikan:

    odps.Schema {
      user_id             int64
      age                 int64
      sex                 string
      occupation          string
      zip_code            string
    }
  4. Gunakan metode head untuk mengambil N baris pertama data sebagai pratinjau cepat.

    print(users.head(10))

    Hasil berikut dikembalikan:

       user_id  age  sex     occupation  zip_code
    0        1   24    M     technician     85711
    1        2   53    F          other     94043
    2        3   23    M         writer     32067
    3        4   24    M     technician     43537
    4        5   33    F          other     15213
    5        6   42    M      executive     98101
    6        7   57    M  administrator     91344
    7        8   36    M  administrator     05201
    8        9   29    M        student     01002
    9       10   53    M         lawyer     90703
  5. Jika tidak ingin melihat semua bidang, lakukan operasi berikut:

    • Tentukan bidang yang ingin dikueri.

      print(users[['user_id', 'age']].head(5))

      Hasil berikut dikembalikan:

         user_id  age
      0        1   24
      1        2   53
      2        3   23
      3        4   24
      4        5   33
    • Kecualikan bidang tertentu.

      print(users.exclude('zip_code', 'age').head(5))

      Hasil berikut dikembalikan:

         user_id  sex  occupation
      0        1    M  technician
      1        2    F       other
      2        3    M      writer
      3        4    M  technician
      4        5    F       other
    • Kecualikan bidang tertentu dan tambahkan bidang baru berdasarkan komputasi. Misalnya, tambahkan bidang sex_bool dan atur nilai sex_bool ke True jika sex adalah M. Jika nilai sex bukan M, atur sex_bool ke False.

      print(users.select(users.exclude('zip_code', 'sex'), sex_bool=users.sex == 'M').head(5))

      Hasil berikut dikembalikan:

         user_id  age  occupation  sex_bool
      0        1   24  technician      True
      1        2   53       other     False
      2        3   23      writer      True
      3        4   24  technician      True
      4        5   33       other     False
  6. Hitung jumlah pengguna pria dan wanita.

    print(users.groupby(users.sex).agg(count=users.count()))

    Hasil berikut dikembalikan:

       sex  count
    0    F    273
    1    M    670
  7. Untuk membagi pengguna berdasarkan pekerjaan, peroleh 10 pekerjaan dengan jumlah pengguna terbesar dan urutkan secara menurun berdasarkan jumlah pengguna.

    df = users.groupby('occupation').agg(count=users['occupation'].count())
    df1 = df.sort(df['count'], ascending=False)
    print(df1.head(10))

    Hasil berikut dikembalikan:

          occupation  count
    0        student    196
    1          other    105
    2       educator     95
    3  administrator     79
    4       engineer     67
    5     programmer     66
    6      librarian     51
    7         writer     45
    8      executive     32
    9      scientist     31

    Atau, gunakan metode value_counts. Jumlah catatan yang dikembalikan dibatasi oleh parameter options.df.odps.sort.limit. Untuk informasi lebih lanjut, lihat Konfigurasi.

    df = users.occupation.value_counts()[:10]
    print(df.head(10)) 

    Hasil berikut dikembalikan:

          occupation  count
    0        student    196
    1          other    105
    2       educator     95
    3  administrator     79
    4       engineer     67
    5     programmer     66
    6      librarian     51
    7         writer     45
    8      executive     32
    9      scientist     31
  8. Join ketiga tabel dan simpan hasilnya sebagai tabel baru bernama pyodps_ml_100k_lens.

    movies = DataFrame(o.get_table('pyodps_ml_100k_movies'))
    ratings = DataFrame(o.get_table('pyodps_ml_100k_ratings'))
    
    o.delete_table('pyodps_ml_100k_lens', if_exists=True)
    lens = movies.join(ratings).join(users).persist('pyodps_ml_100k_lens')
    
    print(lens.dtypes)

    Hasil berikut dikembalikan:

    odps.Schema {
      movie_id                          int64       
      title                             string      
      release_date                      string      
      ideo_release_date                 string      
      imdb_url                          string      
      unknown                           int64       
      action                            int64       
      adventure                         int64       
      animation                         int64       
      children                          int64       
      comedy                            int64       
      crime                             int64       
      documentary                       int64       
      drama                             int64       
      fantasy                           int64       
      filmnoir                          int64       
      horror                            int64       
      musical                           int64       
      mystery                           int64       
      romance                           int64       
      scifi                             int64       
      thriller                          int64       
      war                               int64       
      western                           int64       
      user_id                           int64       
      rating                            int64       
      timestamp                         int64       
      age                               int64       
      sex                               string      
      occupation                        string      
      zip_code                          string      
    }

Gunakan DataFrame untuk memproses data

Sebelum melanjutkan langkah-langkah berikut, unduh dataset Iris. Node PyODPS DataWorks digunakan dalam contoh ini. Untuk informasi lebih lanjut, lihat Mengembangkan Tugas PyODPS 3.

  1. Buat tabel untuk menyimpan data uji.

    Gunakan fitur manajemen tabel DataWorks untuk membuat tabel.

    1. Klik alur kerja yang diinginkan di bagian Business Flow, klik kanan MaxCompute, dan pilih Create Table. Di kotak dialog Create Table, pilih jalur dari daftar drop-down Path, masukkan nama di bidang Name, lalu klik Create.

    2. Di pojok kiri atas halaman pengeditan tabel, klik ikon image.png.

    3. Eksekusi pernyataan berikut untuk membuat tabel:

      CREATE TABLE pyodps_iris (
          sepallength double COMMENT 'panjang sepal (cm)',
          sepalwidth double COMMENT 'lebar sepal (cm)',
          petallength double COMMENT 'panjang petal (cm)',
          petalwidth double COMMENT 'lebar petal (cm)',
          name string COMMENT 'nama'
      ) ;
  2. Unggah data uji.

    1. Klik kanan nama tabel yang telah dibuat, dan pilih Import Data. Di kotak dialog Data Import Wizard, klik Next, lalu klik Browse untuk mengunggah dataset yang telah diunduh.

      image

    2. Pilih Match by location dan klik Import Data.

  3. Klik alur kerja yang diinginkan, klik kanan MaxCompute, lalu pilih Create Node > PyODPS 3 untuk membuat node PyODPS guna menyimpan dan menjalankan kode.

  4. Tulis kode dan klik ikon image.png. Hasil dapat dilihat di bagian Runtime Log di panel bawah. Detail kode:

    from odps import ODPS
    from odps.df import DataFrame, output
    import os
    
    # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke ID AccessKey pengguna,
    # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Rahasia AccessKey pengguna,
    # kami tidak merekomendasikan langsung menggunakan string ID AccessKey dan Rahasia AccessKey.
    o = ODPS(
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    # Buat objek DataFrame iris dari tabel MaxCompute. 
    iris = DataFrame(o.get_table('pyodps_iris'))
    print(iris.head(10))
    # Tampilkan sebagian isi iris. 
    print(iris.sepallength.head(5))
    
    # Gunakan fungsi yang ditentukan pengguna untuk menghitung jumlah dua kolom iris. 
    print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3))
    
    # Tentukan nama dan tipe keluaran fungsi. 
    @output(['iris_add', 'iris_sub'], ['float', 'float'])
    def handle(row):
        # Gunakan kata kunci yield untuk mengembalikan beberapa baris hasil. 
        yield row.sepallength - row.sepalwidth, row.sepallength + row.sepalwidth
        yield row.petallength - row.petalwidth, row.petallength + row.petalwidth
    
    # Tampilkan hasil lima baris pertama. axis=1 menunjukkan bahwa sumbu kolom diperluas secara horizontal.
      print(iris.apply(handle, axis=1).head(5))

    Hasil berikut dikembalikan:

    # print(iris.head(10))
       sepallength  sepalwidth  petallength  petalwidth         name
    0          4.9         3.0          1.4         0.2  Iris-setosa
    1          4.7         3.2          1.3         0.2  Iris-setosa
    2          4.6         3.1          1.5         0.2  Iris-setosa
    3          5.0         3.6          1.4         0.2  Iris-setosa
    4          5.4         3.9          1.7         0.4  Iris-setosa
    5          4.6         3.4          1.4         0.3  Iris-setosa
    6          5.0         3.4          1.5         0.2  Iris-setosa
    7          4.4         2.9          1.4         0.2  Iris-setosa
    8          4.9         3.1          1.5         0.1  Iris-setosa
    9          5.4         3.7          1.5         0.2  Iris-setosa
    
    
    # print(iris.sepallength.head(5))
       sepallength
    0          4.9
    1          4.7
    2          4.6
    3          5.0
    4          5.4
    
    # print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3))
       sepaladd
    0       7.9
    1       7.9
    2       7.7
    
    # print(iris.apply(handle,axis=1).head(5))
       iris_add  iris_sub
    0       1.9       7.9
    1       1.2       1.6
    2       1.5       7.9
    3       1.1       1.5
    4       1.5       7.7