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
SELECT söz dizimi hakkında daha fazla bilgi için bkz. OSS'ten Veri Okuma.
Sorgu planlarını optimize etme hakkında daha fazla bilgi için bkz. Sorgu Optimizasyonu.
Ö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:
-
Ön koşullar
-
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.
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.
-
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.jarolduğunu varsayalım. Kaynağı paketleme yükleme ve kaydetme hakkında daha fazla bilgi için bkz. Paketleme, Yükleme ve Kaydetme.NotBirden fazla bağımlılığınız varsa her birini ayrı ayrı paketleyin ve ayrı bir MaxCompute kaynağı olarak yükleyin.
-
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.Notdelimiter 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.
-
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 | +----------+-----------+-----------+ -
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
-
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; -
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())); -
Çı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.jaryolu JAR paketinin yerel yoludur. -
Üçü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.jaryolu üçüncü taraf Joda-Time JAR paketinin yerel yoludur. -
Test verilerini OSS'teki belirtilen dizine yükleyin. Dosyanın adının
video_play_log.txtolduğunu varsayalım. Örnek veriler:5c661071dba64d5080c91da085ff1073^music-click-fast_forward^26.12.XX.XX^2019-11-11 06:43:36 -
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 | +------+-------+---+----------------+
-