Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Özel depolama işleyicisi

Son Güncelleme:Oct 04, 2026

Bu konuda, özel bir depolama işleyicisi kullanarak OSS harici tablosu oluşturma ve bu tabloya veri yazma ile tablodan veri okuma işlemleri açıklanmaktadır.

Kullanım notları

  • OSS harici tablolar küme özelliğini desteklemez.

  • Tek bir dosyanın boyutu 2 GB'ı aşamaz. 2 GB'tan büyük dosyaları bölmeniz gerekir.

Harici tablo oluşturma

Söz dizimi

CREATE EXTERNAL TABLE [IF NOT EXISTS] mc_oss_extable_name
(
  col_name data_type,
  ...
)
[comment table_comment]
[partitioned BY (col_name data_type, ...)] 
stored BY '<YOUR_DEFINED_STORAGEHANDLER>' 
WITH serdeproperties (
  ['property_name'='property_value',...]
) 
location 'oss_location' 
USING 'jar_name';

Varsayılan olarak özel depolama işleyicileri veri parçalamaz. Bu durum, olası doğruluk sorunlarını önler. İşleyicinizin parçalanmış verileri işleyebileceğini onaylarsanız veri parçalamayı etkinleştirmek ve birden fazla eşleyici başlatmak için aşağıdaki komutu çalıştırın.

SET odps.sql.unstructured.data.single.file.split.enabled=true;

Ortak parametreler

Ortak parametreler hakkında daha fazla bilgi için bkz. Temel söz dizimi parametreleri.

Özel parametreler

Parametre

Gerekli mi?

Açıklama

your_defined_storagehandler

Evet

MaxCompute kullanıcı tanımlı işlevi (UDF) olarak uyguladığınız özel bir depolama işleyicisi. UDF geliştirmeye ilişkin daha fazla bilgi için bkz. UDF Geliştirme.

jar_name

Evet

Özel depolama işleyicisinin kodunu içeren JAR paketi. Bu JAR paketini MaxCompute projenize kaynak olarak eklemeniz gerekir.

Kaynak ekleme hakkında daha fazla bilgi için bkz. Kaynak İşlemleri.

resource_name

Hayır

Özel bir SerDe sınıfı kullanıyorsanız bağımlı JAR kaynaklarını belirtin.

Bu kaynaklar özel SerDe sınıfını içermeli ve MaxCompute projenize kaynak olarak eklenmelidir.

Kaynak ekleme hakkında daha fazla bilgi için bkz. Kaynak İşlemleri.

Veri yazma

MaxCompute yazma söz dizimi hakkında daha fazla bilgi için bkz. OSS'e Veri Yazma.

Verileri sorgulama ve analiz etme

Örnek: OSS harici tablosu oluşturma

Bu örnekte Ek: Örnek verileri hazırlama bölümünde açıklanan ve özel bir depolama işleyicisiyle kullanılmak üzere hazırlanan SampleData/ dizinine harici tablonun nasıl eşleneceği gösterilmektedir. Prosedür şu şekildedir:

  1. Ön koşullar

    • Bir MaxCompute projesi oluşturulmuştur.

    • Bir OSS paketi ve klasörü mevcuttur. Daha fazla bilgi için bkz. Paket Oluşturma ve Klasörleri Yönetme.

      MaxCompute OSS'te otomatik klasör oluşturmayı destekler. Bir SQL ifadesi harici tabloları ve kullanıcı tanımlı işlevleri (UDF) içeriyorsa tek bir ifadeyle tabloları okuyup yazabilir ve UDF'leri kullanabilirsiniz. Klasörleri manuel olarak da oluşturabilirsiniz.

      MaxCompute yalnızca belirli bölgelerde dağıtılmıştır. Bölge arası veri bağlantılarıyla ilgili olası sorunlardan kaçınmak için OSS paketinizin MaxCompute projenizle aynı bölgede olduğundan emin olun.
    • Yetkilendirme

      • OSS'e erişim izniniz olmalıdır. OSS harici tablolarına erişmek için bir Alibaba Cloud hesabı Resource Access Management (RAM) kullanıcısı veya RAM rolü kullanabilirsiniz. Yetkilendirme hakkında daha fazla bilgi için bkz. OSS için STS Modunda Erişimi Yetkilendirme.

      • MaxCompute projesinde CreateTable iznine sahip olmanız gerekir. Tablo izinleri hakkında daha fazla bilgi için bkz. MaxCompute İzinleri.

  2. MaxCompute Studio'yu kullanarak TextExtractor.java, TextOutputer.java, SplitReader.java ve TextStorageHandler.java Java sınıflarını oluşturun. Java programları geliştirmeye ilişkin daha fazla bilgi için bkz. UDF Geliştirme.

  3. TextStorageHandler.java dosyasını paketlemek için MaxCompute Studio'nun tek tıkla paketleme özelliğini kullanın ve paketi bir MaxCompute kaynağı olarak yükleyin.

    Kaynağın adının javatest-1.0-SNAPSHOT.jar olduğunu varsayalım. Kaynağı paketleme yükleme ve kaydetme hakkında daha fazla bilgi için bkz. Paketleme, Yükleme ve Kaydetme.

    Not

    Birden fazla bağımlılığınız varsa her birini ayrı ayrı paketleyin ve ayrı bir MaxCompute kaynağı olarak yükleyin.

  4. OSS harici tablosunu oluşturmak için aşağıdaki komutu çalıştırın:

    CREATE EXTERNAL TABLE ambulance_data_txt_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' 
      WITH serdeproperties (
        'delimiter'='|',  
        'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
      )
    location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/'
    USING 'javatest-1.0-SNAPSHOT.jar'; 
    
    -- You can run the 'desc extended ambulance_data_txt_external;' command to view the schema of the created external table.
    Not

    delimiter parametresi OSS dosyasındaki sütun ayırıcıyı tanımlayan özel bir özelliktir. Ayırıcı olarak herhangi bir geçerli dize belirtebilirsiniz.

  5. OSS'ten veri okuyun. Örnek komut:

    SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;

    Aşağıdaki sonuç döndürülür:

    +----------+-----------+-----------+
    | recordid | patientid | direction |
    +----------+-----------+-----------+
    | 1        | 51        | S         |
    | 3        | 48        | NE        |
    | 4        | 30        | W         |
    | 5        | 47        | S         |
    | 7        | 53        | N         |
    | 8        | 63        | SW        |
    | 10       | 31        | N         |
    +----------+-----------+-----------+
  6. OSS harici tablosuna veri yazın.

    INSERT INTO ambulance_data_txt_external VALUES (1,16,76,1,'46.81006','-92.08174','9/14/2014 0:10','SW');
    
    -- Query the table again to check whether the data is written. You can also check whether a new file is generated in the OSS directory.
    SELECT * FROM ambulance_data_txt_external WHERE recordId='16';

SSS

Özel bir çıkarıcı kullanarak yapılandırılmamış verilerden bir DATETIME alanı okurken neden ODPS-0123131 hatası alıyorum?

  • Belirti

    Yapılandırılmamış verileri okumak için özel bir çıkarıcı kullandığınızda alan DATETIME türündeyse (örneğin 2019-11-11 06:43:36) aşağıdaki hata oluşur:

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.IllegalArgumentException
        at java.sql.Date.valueOf(Date.java:143)
        at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194)
        at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153)
        at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)       
  • Neden

    Hata Date.valueOf(parts[i]) kodundan kaynaklanır. java.sql.Date.valueOf() işlevi yalnızca "yyyy-[m]m-[d]d" formatındaki dizeleri kabul eder ve zaman bilgisi içeren dizeleri desteklemez.

  • Çözüm

    1. Joda-Time bağımlılığını ekleyin ve kodunuzda gerekli sınıfları içeri aktarın.

      -- Dependency.
      <dependency>
        <groupId>joda-time</groupId>
        <artifactId>joda-time</artifactId>
        <version>2.10</version>
      </dependency> 
      -- Import information.
      import org.joda.time.DateTime;
      import org.joda.time.format.DateTimeFormat;                           
    2. Hem tarih hem de saat içeren dizeyi ayrıştırmak için Joda-Time DateTimeFormat.forPattern() işlevini kullanın. Ardından ayrıştırılan değerden bir java.sql.Date nesnesi oluşturun.

      record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));                           
    3. Çıkarıcı projesi için oluşturulan JAR paketini yüklemek üzere MaxCompute istemcisini kullanın.

      add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar      

      /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar yolu JAR paketinin yerel yoludur.

    4. Üçüncü taraf Joda-Time JAR paketini yüklemek için MaxCompute istemcisini kullanın.

      add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar                         

      /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar yolu üçüncü taraf Joda-Time JAR paketinin yerel yoludur.

    5. Test verilerini OSS'teki belirtilen dizine yükleyin. Dosyanın adının video_play_log.txt olduğunu varsayalım. Örnek veriler:

      5c661071dba64d5080c91da085ff1073^music-click-fast_forward^26.12.XX.XX^2019-11-11 06:43:36                           
    6. Harici tablodan veri okuyun.

      select * from <project_name>.video_play_log;

      Aşağıdaki sonuç döndürülür:

      +------+-------+---+----------------+
      | uuid  | action  | ip  | time      |
      +------+-------+---+----------------+
      | 5c661071dba64d5080c91da085ff1073 | music-click-fast_forward | 26.12.XX.XX | 2019-11-11 06:43:36 |
      +------+-------+---+----------------+