All Products
Search
Document Center

DataWorks:Tabel eksternal

Last Updated:Jun 21, 2026

Topik ini menjelaskan cara membuat dan mengonfigurasi tabel eksternal di DataWorks serta mencantumkan tipe data yang didukung oleh tabel eksternal.

Ikhtisar

Sebelum menggunakan tabel eksternal, pahami konsep-konsep yang dijelaskan dalam tabel berikut.

Parameter

Deskripsi

Object Storage Service (OSS)

OSS menyediakan kelas penyimpanan Standard, Infrequent Access, dan Archive untuk menangani berbagai skenario penyimpanan. OSS terintegrasi dengan komunitas open-source Hadoop dan produk lainnya, seperti E-MapReduce (EMR), Batch Compute, MaxCompute, Machine Learning Platform for AI (PAI), dan Function Compute.

MaxCompute

MaxCompute adalah solusi data warehousing yang cepat dan sepenuhnya terkelola. Anda dapat mengintegrasikan MaxCompute dengan OSS untuk menganalisis dan memproses data dalam jumlah besar secara efisien dan hemat biaya.

Tabel eksternal MaxCompute

Ditenagai oleh mesin komputasi MaxCompute V2.0, tabel eksternal memungkinkan Anda langsung melakukan kueri terhadap file besar di OSS tanpa harus memuat data ke dalam tabel MaxCompute. Hal ini mengurangi waktu dan tenaga untuk migrasi data serta menghemat biaya penyimpanan.

Gambar berikut menunjukkan arsitektur pemrosesan keseluruhan dari tabel eksternal.架构图

MaxCompute mendukung pembuatan tabel eksternal untuk data dari layanan penyimpanan tak terstruktur, seperti OSS dan Tablestore. Framework pemrosesan tak terstruktur menangani impor dan ekspor data untuk platform MaxCompute. Sebagai contoh, berikut logika pemrosesan untuk tabel eksternal OSS:

  1. Framework tak terstruktur mengubah data OSS eksternal dan menyediakannya ke kode kustom Anda melalui kelas Java InputStream. Anda dapat mengimplementasikan logika EXTRACT untuk membaca, mengurai, mengubah, dan menghitung input dari InputStream, lalu mengembalikan data dalam format universal Record yang dapat diproses oleh MaxCompute.

  2. Record-record tersebut dapat diproses menggunakan logika SQL di MaxCompute. Komputasi ini didasarkan pada mesin SQL terstruktur bawaan MaxCompute dan dapat menghasilkan record baru.

  3. Sistem meneruskan record yang telah diproses ke logika OUTPUT kustom Anda untuk transformasi lebih lanjut. Anda kemudian dapat menggunakan OutputStream yang disediakan sistem untuk menulis informasi yang diperlukan dari record ke OSS.

Anda dapat menggunakan DataWorks bersama MaxCompute untuk melakukan berbagai operasi pada tabel eksternal secara visual, seperti membuat, mencari, mengkueri, mengonfigurasi, memproses, dan menganalisisnya.

Jaringan dan otorisasi akses

Karena MaxCompute dan OSS merupakan dua layanan independen, konektivitas jaringan antara kluster penerapannya dapat memengaruhi kemampuan MaxCompute untuk mengakses data di OSS. Saat mengakses data OSS dari MaxCompute, gunakan titik akhir internal OSS, yaitu alamat host yang diakhiri dengan -internal.aliyuncs.com.

MaxCompute memerlukan saluran otorisasi aman untuk mengakses data OSS. MaxCompute menggunakan Resource Access Management (RAM) dan Security Token Service (STS) Alibaba Cloud untuk memastikan akses data yang aman. Saat meminta izin, MaxCompute mengajukannya ke STS atas identitas pembuat tabel. Pengaturan izin untuk Tablestore sama dengan untuk OSS.

  1. Otorisasi STS

    Untuk mengakses data OSS, MaxCompute memerlukan izin yang sesuai yang diberikan kepada akun aksesnya. STS adalah layanan manajemen token aman yang disediakan oleh RAM. Layanan ini memungkinkan layanan cloud atau pengguna RAM yang berwenang untuk menerbitkan token akses sementara dengan periode validitas dan izin kustom. Aplikasi yang memperoleh token ini kemudian dapat memanggil API Alibaba Cloud untuk mengakses resource.

    Anda dapat memberikan izin dengan salah satu dari dua cara berikut:

    • Jika proyek MaxCompute dan bucket OSS berada dalam satu Akun Alibaba Cloud yang sama, Anda dapat melakukan otorisasi satu klik setelah login dengan akun tersebut.

      1. Buka halaman editor untuk tabel baru dan buka bagian Physical Model.

      2. Untuk Table Type, pilih External Table.

      3. Di sebelah Storage Address, klik Authorize. Lalu, klik Authorize lagi.

      4. Pada kotak dialog Cloud Resource Access Authorization, klik Authorize. Pada halaman otorisasi, pilih peran AliyunODPSDefaultRole, yang digunakan oleh layanan ODPS untuk mengakses resource OSS dan Tablestore. Kemudian, klik Confirm Authorization.

    • Gunakan otorisasi kustom untuk memberikan akses MaxCompute ke OSS di Konsol RAM.

      1. Login ke Konsol RAM.

        Catatan

        Jika MaxCompute dan OSS berada di akun berbeda, login dengan akun OSS untuk memberikan otorisasi.

      2. Di panel navigasi kiri, pilih Identities > Role.

      3. Klik Create Role, pilih Alibaba Cloud Account sebagai entitas tepercaya, lalu klik Next.

      4. Masukkan Role name dan Remarks.

        Catatan

        Atur nama peran menjadi AliyunODPSDefaultRole atau AliyunODPSRoleForOtherUser.

      5. Untuk Select Trusted Alibaba Cloud Account, pilih Current Alibaba Cloud Account atau Another Alibaba Cloud Account.

        Catatan

        Jika Anda memilih Another Alibaba Cloud Account, Anda harus memasukkan ID akun lain tersebut.

      6. Klik OK.
      7. Konfigurasikan detail peran.

        Di halaman manajemen peran, klik nama peran RAM tersebut. Di tab Trust Policy, klik Edit Trust Policy dan masukkan konten kebijakan berikut sesuai skenario Anda.

        -- Jika proyek MaxCompute dan bucket OSS berada dalam satu akun yang sama.
        {
        "Statement": [
        {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
        "Service": [
        "odps.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
        }                                           
        -- Jika proyek MaxCompute dan bucket OSS berada dalam akun berbeda.
        {
        "Statement": [
        {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
        "Service": [
        "ID akun Alibaba Cloud pemilik proyek MaxCompute@odps.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
        }

        Setelah konfigurasi selesai, klik Save trust policy.

      8. Konfigurasikan kebijakan otorisasi untuk peran tersebut. Temukan dan sambungkan kebijakan AliyunODPSRolePolicy, yang diperlukan agar peran dapat mengakses OSS. Jika tidak menemukan kebijakan ini saat mencari, Anda dapat membuat kebijakan kustom.

        {
            "Version": "1",
            "Statement": [
                {
                    "Action": [
                        "oss:ListBuckets",
                        "oss:GetObject",
                        "oss:ListObjects",
                        "oss:PutObject",
                        "oss:DeleteObject",
                        "oss:AbortMultipartUpload",
                        "oss:ListParts"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                },
                {
                    "Action": [
                        "ots:ListTable",
                        "ots:DescribeTable",
                        "ots:GetRow",
                        "ots:PutRow",
                        "ots:UpdateRow",
                        "ots:DeleteRow",
                        "ots:GetRange",
                        "ots:BatchGetRow",
                        "ots:BatchWriteRow",
                        "ots:ComputeSplitPointsBySize"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                },
                {
                    "Action": [
                        "pvtz:DescribeRegions",
                        "pvtz:DescribeZones",
                        "pvtz:DescribeZoneInfo",
                        "pvtz:DescribeVpcs",
                        "pvtz:DescribeZoneRecords"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                },
                {
                    "Action": [
                        "dlf:CreateFunction",
                        "dlf:BatchGetPartitions",
                        "dlf:ListDatabases",
                        "dlf:CreateLock",
                        "dlf:UpdateFunction",
                        "dlf:BatchUpdateTables",
                        "dlf:DeleteTableVersion",
                        "dlf:UpdatePartitionColumnStatistics",
                        "dlf:ListPartitions",
                        "dlf:DeletePartitionColumnStatistics",
                        "dlf:BatchUpdatePartitions",
                        "dlf:GetPartition",
                        "dlf:BatchDeleteTableVersions",
                        "dlf:ListFunctions",
                        "dlf:DeleteTable",
                        "dlf:GetTableVersion",
                        "dlf:AbortLock",
                        "dlf:GetTable",
                        "dlf:BatchDeleteTables",
                        "dlf:RenameTable",
                        "dlf:RefreshLock",
                        "dlf:DeletePartition",
                        "dlf:UnLock",
                        "dlf:GetLock",
                        "dlf:GetDatabase",
                        "dlf:GetFunction",
                        "dlf:BatchCreatePartitions",
                        "dlf:ListPartitionNames",
                        "dlf:RenamePartition",
                        "dlf:CreateTable",
                        "dlf:BatchCreateTables",
                        "dlf:UpdateTableColumnStatistics",
                        "dlf:ListTableNames",
                        "dlf:UpdateDatabase",
                        "dlf:GetTableColumnStatistics",
                        "dlf:ListFunctionNames",
                        "dlf:ListPartitionsByFilter",
                        "dlf:GetPartitionColumnStatistics",
                        "dlf:CreatePartition",
                        "dlf:CreateDatabase",
                        "dlf:DeleteTableColumnStatistics",
                        "dlf:ListTableVersions",
                        "dlf:BatchDeletePartitions",
                        "dlf:ListCatalogs",
                        "dlf:UpdateTable",
                        "dlf:ListTables",
                        "dlf:DeleteDatabase",
                        "dlf:BatchGetTables",
                        "dlf:DeleteFunction"
                    ],
                    "Resource": "*",
                    "Effect": "Allow"
                }
            ]
        }
  2. Gunakan sumber data OSS

    Jika Anda telah membuat dan menyimpan sumber data OSS, temukan ruang kerja Anda di halaman Workspace list, klik Operation di kolom Management, lalu lihat dan gunakan sumber data tersebut di halaman Data Source.

Membuat tabel eksternal

  1. Buat tabel menggunakan pernyataan DDL

    Buka halaman Data Studio. Untuk informasi selengkapnya tentang cara membuat tabel menggunakan pernyataan DDL, lihat Buat dan gunakan tabel MaxCompute. Anda hanya perlu mengikuti sintaks standar MaxCompute. Jika Anda telah berhasil mengotorisasi layanan STS, Anda tidak perlu mengatur properti odps.properties.rolearn.

    Pernyataan DDL contoh berikut menunjukkan cara membuat tabel. Parameter EXTERNAL menentukan bahwa tabel tersebut merupakan tabel eksternal.

    CREATE EXTERNAL TABLE IF NOT EXISTS ambulance_data_csv_external(
    vehicleId int,
    recordId int,
    patientId int,
    calls int,
    locationLatitute double,
    locationLongtitue double,
    recordTime string,
    direction string
    )
    STORED BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' -- Wajib. Klausul STORED BY menentukan nama kelas StorageHandler kustom atau format file lain untuk tabel eksternal.
    with SERDEPROPERTIES (
    'delimiter'='\\|', -- Opsional. Klausul SERDEPROPERTIES menentukan parameter yang digunakan untuk serialisasi dan deserialisasi data. Parameter ini dapat diteruskan ke logika Extractor melalui DataAttributes.
    'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole'
    )
    LOCATION 'oss://oss-cn-shanghai-internal.aliyuncs.com/oss-odps-test/Demo/SampleData/CustomTxt/AmbulanceData/'     -- Wajib. Klausul LOCATION menentukan lokasi penyimpanan tabel eksternal.
    USING 'odps-udf-example.jar'; -- Menentukan paket JAR yang berisi definisi kelas saat Anda menggunakan format kustom. Klausul ini tidak diperlukan jika Anda tidak menggunakan format kustom.

    Klausul STORED BY diikuti oleh parameter yang menentukan StorageHandler bawaan default untuk file CSV atau TSV. Parameter tersebut dijelaskan sebagai berikut:

    • CSV: com.aliyun.odps.CsvStorageHandler. Handler ini mendefinisikan cara membaca dan menulis data berformat CSV. Secara konvensi, pemisah kolom adalah koma (,) dan pemisah baris adalah karakter newline (\n). Contoh: STORED BY 'com.aliyun.odps.CsvStorageHandler'.

    • TSV: com.aliyun.odps.TsvStorageHandler. Handler ini mendefinisikan cara membaca dan menulis data berformat TSV. Secara konvensi, pemisah kolom adalah tab (\t) dan pemisah baris adalah karakter newline (\n).

    Klausul STORED BY juga mendukung external tables for open-source formats, seperti ORC, PARQUET, SEQUENCEFILE, RCFILE, AVRO, dan TEXTFILE. Untuk TEXTFILE, Anda dapat menentukan kelas serialisasi, seperti org.apache.hive.hcatalog.data.JsonSerDe.

    • org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as textfile

    • org.apache.hadoop.hive.ql.io.orc.OrcSerde -> stored as orc

    • org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe -> stored as parquet

    • org.apache.hadoop.hive.serde2.avro.AvroSerDe -> stored as avro

    • org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as sequencefile

    Gunakan pernyataan DDL berikut untuk membuat tabel eksternal untuk format open-source.

      CREATE EXTERNAL TABLE [IF NOT EXISTS] (<column schemas>)
      [PARTITIONED BY (partition column schemas)]
      [ROW FORMAT SERDE '']
      STORED AS 
      [WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='${roleran}'
      [,'name2'='value2',...]
      ) ]
      LOCATION 'oss://${endpoint}/${bucket}/${userfilePath}/';

    Tabel berikut menjelaskan properti SerDe.

    Parameter

    Nilai

    Default

    Deskripsi

    odps.text.option.gzip.input.enabled

    true/false

    false

    Mengaktifkan atau menonaktifkan kompresi baca.

    odps.text.option.gzip.output.enabled

    true/false

    false

    Mengaktifkan atau menonaktifkan kompresi tulis.

    odps.text.option.header.lines.count

    Bilangan bulat non-negatif

    0

    Melewatkan N baris pertama header file teks.

    odps.text.option.null.indicator

    String

    String kosong

    String yang merepresentasikan nilai NULL selama penguraian atau penulisan.

    odps.text.option.ignore.empty.lines

    true/false

    true

    Menentukan apakah baris kosong diabaikan.

    odps.text.option.encoding

    UTF-8/UTF-16/US-ASCII

    UTF-8

    Menentukan pengkodean karakter teks.

Catatan

MaxCompute hanya mendukung pembacaan data CSV atau TSV terkompresi gzip dari OSS menggunakan extractor bawaan. Anda dapat memilih apakah file dikompresi gzip atau tidak, yang menentukan properti yang perlu diatur.

Parameter LOCATION memiliki format berikut: oss://oss-cn-shanghai-internal.aliyuncs.com/BucketName/DirectoryName. Anda dapat memilih alamat direktori OSS melalui kotak dialog GUI. Anda tidak perlu menambahkan nama file setelah direktori.

Tabel yang dibuat dalam mode DDL muncul di pohon node tabel di bawah manajemen tabel. Anda dapat mengubah posisi tampilannya dengan memodifikasi tema level-1 dan level-2.

  • Tabel eksternal Tablestore

    Gunakan pernyataan berikut untuk membuat tabel eksternal Tablestore.

    CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external(
    odps_orderkey bigint,
    odps_orderdate string,
    odps_custkey bigint,
    odps_orderstatus string,
    odps_totalprice double
    )
    STORED BY 'com.aliyun.odps.TableStoreStorageHandler' 
    WITH SERDEPROPERTIES (
    'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey, o_orderstatus,o_totalprice', -- (3)
    'tablestore.table.name'='ots_tpch_orders'
    'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole'
    )
    LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com'; 

    Parameter tersebut dijelaskan sebagai berikut:

    • com.aliyun.odps.TableStoreStorageHandler adalah StorageHandler bawaan di MaxCompute untuk memproses data Tablestore.

    • Klausul SERDEPROPERTIES menentukan opsi parameter. Saat menggunakan TableStoreStorageHandler, Anda harus menentukan dua opsi: tablestore.columns.mapping dan tablestore.table.name.

      • tablestore.columns.mapping: Opsi wajib yang menjelaskan kolom tabel Tablestore yang akan diakses oleh MaxCompute. Ini mencakup kunci primer dan atribut. Awalan titik dua (:) menunjukkan kunci primer Tablestore. Misalnya, dalam pernyataan ini, :o_orderkey dan :o_orderdate adalah kunci primer, sedangkan yang lainnya adalah kolom atribut.

        Tablestore mendukung satu hingga empat kunci primer bertipe STRING, INTEGER, atau BINARY. Kunci primer pertama adalah kunci partisi. Saat menentukan pemetaan, Anda harus menyediakan semua kunci primer dari tabel Tablestore yang ditentukan. Untuk kolom atribut, Anda hanya perlu menyediakan kolom yang perlu diakses oleh MaxCompute.

      • tablestore.table.name: Nama tabel Tablestore yang akan diakses. Jika nama tabel yang ditentukan salah atau tidak ada, MaxCompute akan melaporkan error. MaxCompute tidak membuat tabel Tablestore secara otomatis.

    • LOCATION: Menentukan nama instans Tablestore, endpoint, dan detail lainnya.

  • Buat tabel melalui GUI

    Buka halaman Data Studio dan buat tabel melalui GUI. Untuk informasi selengkapnya, lihat Buat dan gunakan tabel MaxCompute. Tabel eksternal memiliki properti berikut:

    • General

      • Nama tabel bahasa Inggris (dimasukkan saat Create Table)

      • Display Name

      • Level-1 Theme dan Level-2 Theme

      • Description

    • Physical Model

      • Table Type: Pilih External Table.

      • Partition Type: Partisi tidak didukung untuk tabel eksternal Tablestore.

      • Storage Address: Ini sesuai dengan parameter LOCATION. Anda dapat mengatur parameter LOCATION di bagian Physical Model. Klik Select untuk memilih alamat penyimpanan. Setelah memilih, klik Authorize.

      • File Format: Pilih format berdasarkan kebutuhan bisnis Anda. Format yang didukung meliputi CSV, TSV, ORC, PARQUET, SEQUENCEFILE, RCFILE, AVRO, TEXTFILE, dan format file kustom. Jika Anda memilih format file kustom, Anda harus memilih resource kustom. Saat Anda mengirimkan resource tersebut, nama kelas yang terdapat di dalamnya dapat diurai secara otomatis dan tersedia untuk dipilih.

      • rolearn: Anda dapat mengosongkan parameter ini jika otorisasi STS telah selesai.

    • Schema: Di bagian Schema, tambahkan bidang-bidang berikut: age (BIGINT, usia), job (STRING, jenis pekerjaan), marital (STRING, status pernikahan), education (STRING, tingkat pendidikan), dan default (STRING, status kartu kredit). Tidak ada bidang ini yang merupakan kunci primer.

      Parameter

      Deskripsi

      Field Type

      MaxCompute 2.0 mendukung berbagai tipe data sederhana dan kompleks.

      Operation

      Mendukung penambahan, modifikasi, dan penghapusan bidang.

      Definition or Maximum Value Length

      Untuk tipe VARCHAR, Anda dapat mengatur panjangnya. Untuk tipe data kompleks, Anda dapat langsung memasukkan definisi tipe.

  • Tipe data yang didukung

    Tabel berikut menjelaskan tipe data sederhana yang didukung oleh tabel eksternal.

    Tipe

    Baru

    Contoh

    Deskripsi

    TINYINT

    Ya

    1Y, -127Y

    Bilangan bulat bertanda 8-bit. Nilainya berkisar dari -128 hingga 127.

    SMALLINT

    Ya

    32767S, -100S

    Bilangan bulat bertanda 16-bit. Nilainya berkisar dari -32.768 hingga 32.767.

    INT

    Ya

    1000, -15645787

    Bilangan bulat bertanda 32-bit. Nilainya berkisar dari -231 hingga 231-1.

    BIGINT

    Tidak

    100000000000L, -1L

    Bilangan bulat bertanda 64-bit. Nilainya berkisar dari -263 hingga 263-1.

    FLOAT

    Ya

    N/A

    Bilangan titik mengambang biner 32-bit.

    DOUBLE

    Tidak

    3.1415926 1E+7

    Bilangan titik mengambang biner presisi ganda 64-bit berukuran 8 byte.

    DECIMAL

    Tidak

    3.5BD, 99999999999.9999999BD

    Tipe numerik eksak basis-10. Bagian bilangan bulat berkisar dari -1036+1 hingga 1036-1, dan bagian pecahan presisi hingga 18 digit desimal.

    VARCHAR(n)

    Ya

    N/A

    Tipe karakter panjang variabel, dengan n sebagai panjangnya. Nilai n berkisar dari 1 hingga 65.535.

    STRING

    Tidak

    "abc", 'bcd', "alibaba"

    Tipe string. Panjang maksimumnya adalah 8 MB.

    BINARY

    Ya

    N/A

    Tipe data biner. Panjang maksimumnya adalah 8 MB.

    DATETIME

    Tidak

    DATETIME '2017-11-11 00:00:00'

    Tipe tanggal dan waktu yang menggunakan UTC+8 sebagai waktu standar sistem. Nilainya berkisar dari 0000-01-01 hingga 9999-12-31 dan akurat hingga milidetik.

    TIMESTAMP

    Ya

    TIMESTAMP '2017-11-11 00:00:00.123456789'

    Tipe timestamp yang tidak bergantung zona waktu. Nilainya berkisar dari 0000-01-01 00:00:00.000000000 hingga 9999-12-31 23:59:59.999999999 dan akurat hingga nanodetik.

    BOOLEAN

    Tidak

    TRUE dan FALSE

    Tipe BOOLEAN, yang nilainya TRUE atau FALSE.

    Tabel berikut menjelaskan tipe data kompleks yang didukung oleh tabel eksternal.

    Tipe

    Definisi

    Konstruktor

    ARRAY

    array< int >; array< struct< a:int, b:string >>

    array(1, 2, 3); array(array(1, 2); array(3, 4))

    MAP

    map< string, string >; map< smallint, array< string>>

    map("k1", "v1", "k2", "v2"); map(1S, array('a', 'b'), 2S, array('x', 'y'))

    STRUCT

    struct< x:int, y:int>; struct< field1:bigint, field2:array< int>, field3:map< int, int>>

    named_struct('x', 1, 'y', 2); named_struct('field1', 100L, 'field2', array(1, 2), 'field3', map(1, 100, 2, 200))

    Jika Anda perlu menggunakan tipe data baru yang didukung oleh MaxCompute 2.0, seperti TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, BINARY, atau tipe kompleks, Anda harus menambahkan pernyataan set odps.sql.type.system.odps2=true; sebelum pernyataan pembuatan tabel. Kirimkan pernyataan set dan pernyataan pembuatan tabel tersebut bersamaan. Untuk kompatibilitas Hive, tambahkan pernyataan set odps.sql.hive.compatible=true;.

    Lihat dan kelola tabel eksternal

    Anda dapat membuka halaman Data Studio dan klik Table Management di panel navigasi kiri untuk mengkueri tabel eksternal. Untuk informasi selengkapnya, lihat Manajemen tabel. Mengelola tabel eksternal mirip dengan mengelola tabel internal.