All Products
Search
Document Center

MaxCompute:Mulai cepat

Last Updated:Jun 21, 2026

Topik ini menjelaskan cara membuat dan menggunakan objek DataFrame untuk pemrosesan data dasar.

Persiapan data

Topik ini menggunakan file u.user, u.item, dan u.data, yang masing-masing berisi data pengguna, film, dan rating.

  1. Buat tabel:

    • Tabel pyodps_ml_100k_users untuk data pengguna.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_users
      (
        user_id    BIGINT COMMENT 'User ID',
        age        BIGINT COMMENT 'Age',
        sex        STRING COMMENT 'Gender',
        occupation STRING COMMENT 'Occupation',
        zip_code   STRING COMMENT 'Zip code'
      );
    • Tabel pyodps_ml_100k_movies untuk data film.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_movies
      (
          movie_id            BIGINT COMMENT 'Movie ID',
          title              STRING COMMENT 'Movie title',
          release_date       STRING COMMENT 'Release date',
          video_release_date STRING COMMENT 'Video release date',
          IMDb_URL           STRING COMMENT 'IMDb URL',
          unknown            TINYINT COMMENT 'Unknown',
          Action             TINYINT COMMENT 'Action',
          Adventure          TINYINT COMMENT 'Adventure',
          Animation          TINYINT COMMENT 'Animation',
          Children           TINYINT COMMENT 'Children',
          Comedy             TINYINT COMMENT 'Comedy',
          Crime              TINYINT COMMENT 'Crime',
          Documentary        TINYINT COMMENT 'Documentary',
          Drama              TINYINT COMMENT 'Drama',
          Fantasy            TINYINT COMMENT 'Fantasy',
          FilmNoir           TINYINT COMMENT 'Film Noir',
          Horror             TINYINT COMMENT 'Horror',
          Musical            TINYINT COMMENT 'Musical',
          Mystery            TINYINT COMMENT 'Mystery',
          Romance            TINYINT COMMENT 'Romance',
          SciFi              TINYINT COMMENT 'Sci-Fi',
          Thriller           TINYINT COMMENT 'Thriller',
          War                TINYINT COMMENT 'War',
          Western            TINYINT COMMENT 'Western'
      );
    • Tabel pyodps_ml_100k_ratings untuk data rating.

      CREATE TABLE IF NOT EXISTS pyodps_ml_100k_ratings
      (
          user_id    BIGINT COMMENT 'User ID',
          movie_id  BIGINT COMMENT 'Movie ID',
          rating    BIGINT COMMENT 'Rating',
          timestamp BIGINT COMMENT 'Timestamp'
      )
  2. Gunakan Tunnel Upload untuk mengimpor file data lokal ke dalam tabel MaxCompute. Untuk informasi selengkapnya tentang operasi Tunnel, lihat Tunnel Commands.

    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;

Operasi DataFrame

Anda kini memiliki tiga tabel: pyodps_ml_100k_movies (film), pyodps_ml_100k_users (pengguna), dan pyodps_ml_100k_ratings (rating). Contoh berikut dijalankan di IPython.

Catatan

Pastikan Python telah diinstal. IPython dibangun di atas Python, sehingga diperlukan lingkungan Python. Kemudian, jalankan pip install IPython. Setelah itu, jalankan perintah ipython untuk memulai lingkungan interaktif dan mulai menulis serta menjalankan kode Python.

  1. Buat objek ODPS.

    import os
    from odps import ODPS
    # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke Access Key ID Anda,
    # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Access Key Secret Anda.
    # Kami menyarankan agar Anda tidak melakukan hardcoding Access Key ID dan Access Key Secret dalam kode 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 dari objek tabel.

    from odps.df import DataFrame
    users = DataFrame(o.get_table('pyodps_ml_100k_users'));
  3. Gunakan properti dtypes untuk melihat kolom dan tipe datanya.

    print(users.dtypes)

    Output:

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

    print(users.head(10))

    Output:

       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 Anda tidak memerlukan semua kolom, gunakan salah satu metode berikut:

    • Pilih subset kolom.

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

      Output:

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

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

      Output:

         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 beberapa kolom dan tambahkan kolom terhitung baru. Misalnya, buat kolom boolean bernama sex_bool yang bernilai True jika nilai sex adalah M dan False untuk nilai lainnya.

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

      Output:

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

    Output:

       sex  count
    0    F    273
    1    M    670
  7. Kelompokkan pengguna berdasarkan pekerjaan, urutkan secara menurun, dan lihat 10 pekerjaan teratas berdasarkan jumlahnya.

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

    Output:

          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

    Sebagai alternatif, gunakan metode value_counts untuk sintaksis yang lebih ringkas. Jumlah baris yang dikembalikan oleh metode ini dibatasi oleh konfigurasi options.df.odps.sort.limit. Untuk informasi selengkapnya, lihat Configuration.

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

    Output:

          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. Gunakan join untuk menggabungkan ketiga tabel dan simpan hasilnya ke 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)

    Output:

    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      
    }

Pemrosesan data DataFrame

Pertama, unduh set data Iris. Bagian ini menggunakan node PyODPS di DataWorks. Untuk informasi selengkapnya, lihat Develop a PyODPS 3 task.

  1. Buat tabel data uji.

    Buat tabel di DataWorks:

    1. Di panel Business Flow, klik kanan MaxCompute dan pilih Create Table. Di kotak dialog Create Table, pilih Path, masukkan Name, lalu klik Create untuk membuka editor tabel.

    2. Klik DDL image.png di pojok kiri atas halaman edit.

    3. Masukkan pernyataan DDL berikut, lalu jalankan pernyataan tersebut untuk membuat tabel.

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

    1. Klik kanan tabel baru tersebut, pilih Import Data, lalu klik Next untuk mengunggah set data yang telah Anda unduh.

      Di kotak dialog Import Data, atur Metode Impor Data menjadi Upload Local File dan Format File menjadi CSV. Pilih file iris.csv yang telah diunduh. Atur Delimiter menjadi Comma, Source Charset menjadi GBK, dan Start Row menjadi 1. Pilih Yes untuk First Row Is Header. Setelah memastikan pratinjau data sudah benar, klik Next.

    2. Klik Match by Position untuk mengimpor data.

  3. Di panel Business Flow, klik kanan MaxCompute, pilih Create Node, lalu pilih PyODPS 3 untuk membuat node PyODPS tempat menyimpan dan menjalankan kode Anda.

  4. Masukkan kode dan klik ikon Run image.png. Setelah kode dijalankan, Anda dapat melihat hasilnya di tab Run log di bawah. Kodenya sebagai berikut:

    from odps import ODPS
    from odps.df import DataFrame, output
    import os
    # Pastikan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_ID diatur ke Access Key ID Anda,
    # dan variabel lingkungan ALIBABA_CLOUD_ACCESS_KEY_SECRET diatur ke Access Key Secret Anda.
    # Kami menyarankan agar Anda tidak melakukan hardcoding Access Key ID dan Access Key Secret dalam kode 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',
    )
    # Buat objek DataFrame bernama iris dari tabel MaxCompute.
    iris = DataFrame(o.get_table('pyodps_iris'))
    print(iris.head(10))
    # Cetak sebagian dari DataFrame iris.
    print(iris.sepallength.head(5))
    # Gunakan fungsi kustom untuk menghitung jumlah dua kolom dalam DataFrame iris.
    print(iris.apply(lambda row: row.sepallength + row.sepalwidth, axis=1, reduce=True, types='float').rename('sepaladd').head(3))
    # Tentukan nama output dan tipe untuk fungsi tersebut.
    @output(['iris_add', 'iris_sub'], ['float', 'float'])
    def handle(row):
        # Gunakan kata kunci yield untuk mengembalikan beberapa baris output.
        yield row.sepallength - row.sepalwidth, row.sepallength + row.sepalwidth
        yield row.petallength - row.petalwidth, row.petallength + row.petalwidth
    # Cetak 5 baris pertama hasilnya. axis=1 menunjukkan operasi per baris.
      print(iris.apply(handle, axis=1).head(5))

    Hasil:

    # 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