SelectObject API'sini kullanarak nesneler üzerinde SQL deyimleri çalıştırabilir ve sonuçları alabilirsiniz.
Genel bilgiler
Hadoop 3.0, Object Storage Service (OSS) içinde depolanan verileri işlemek üzere E-MapReduce (EMR) üzerinde Spark, Hive ve Presto gibi hizmetlerin çalıştırılmasını destekler. MaxCompute ve Data Lake Analytics (DLA) gibi Alibaba Cloud hizmetleri de verileri doğrudan OSS üzerinden işlemeyi destekler.
Geleneksel olarak büyük veri platformları, filtreleme ve analiz işlemleri öncesinde tüm nesneleri OSS'ten indirmek için GetObject API'sini kullanır.
SelectObject API, projeksiyonlar ve filtreler gibi sorgu mantığını OSS katmanına aktararak bu sorunu çözer. Bu sayede yalnızca ihtiyacınız olan veri alt kümesini alabilir, veri aktarımını azaltabilir, maliyetleri düşürebilir ve istemci tarafındaki CPU ile bellek kullanımından tasarruf edebilirsiniz. Bu verimlilik, OSS üzerindeki veri analizini daha cazip hale getirir.
Faturalama
SelectObject API'sini kullanarak veri sorguladığınızda, kaynak nesneden taranan gerçek veri miktarına göre ücretlendirilirsiniz. Daha fazla bilgi için bkz. Veri işleme ücretleri.
Desteklenen nesne biçimleri
SelectObject API, belirli nesne biçimlerini ve SQL sözdizimini destekler.
RFC 4180 standardına uygun CSV nesneleri. TSV gibi CSV benzeri nesneleri içerir. Özel satır sınırlayıcıları, sütun sınırlayıcıları ve tırnak karakterleri belirtebilirsiniz.
-
UTF-8 kodlamalı JSON nesneleri. DOCUMENT ve LINES olmak üzere iki biçim desteklenir.
DOCUMENT: Tüm nesne tek bir geçerli JSON nesnesidir.
LINES: Nesne, her biri kendi kendine yeterli bir JSON nesnesi olan birden çok satırdan oluşur. Satırlar \n veya \r\n gibi yeni satır karakterleriyle ayrılır. Sınırlayıcıyı belirtmeniz gerekmez. Ancak tüm nesne geçerli bir JSON nesnesi değildir.
Standart ve Seyrek Erişim depolama sınıflarındaki nesneler. Arşiv, Soğuk Arşiv veya Derin Soğuk Arşiv depolama sınıfındaki nesnelerin sorgulanabilmesi için önce geri yüklenmesi gerekir.
OSS tarafından yönetilen anahtarlarla veya KMS tarafından yönetilen bir CMK ile sunucu taraflı şifreleme kullanılarak şifrelenen nesneler.
Desteklenen SQL sözdizimi
SQL yan tümceleri: SELECT, FROM, WHERE
Veri türleri: string, int (64 bit), double (64 bit), decimal (128 bit), timestamp ve bool
-
Operatörler: Mantıksal (AND, OR, NOT), Aritmetik (+, -, *, /, %), Karşılaştırma (>, =, <, >=, <=, !=) ve Dize (LIKE, ||)
ÖnemliLIKE operatörü büyük/küçük harfe duyarlı desen eşleşmesi gerçekleştirir.
Desteklenen veri türleri
Varsayılan olarak, bir CSV nesnesindeki tüm veriler dize olarak kabul edilir. Açık tür dönüştürmeleri yapmak için CAST işlevini kullanabilirsiniz.
Aşağıdaki örnek, _1 ve _2 sütunlarında değerleri tam sayılara dönüştürmek için bir SQL sorgusunun nasıl kullanılacağını gösterir:Select * from OSSOBject where cast (_1 as int) > cast(_2 as int)
SelectObject API ayrıca WHERE yan tümcesinde örtük tür dönüştürmeyi de destekler. Örneğin, aşağıdaki ifadede ilk ve ikinci sütunlardaki değerler örtük olarak tam sayılara dönüştürülür:
Select _1 from ossobject where _1 + _2 > 100
JSON nesneleri için CAST işlevini kullanmazsanız veri türü nesnenin içeriğine göre belirlenir. Standart yerleşik JSON veri türleri arasında null, bool, int64, double ve string bulunur.
SQL örnekleri
Bu bölümde CSV ve JSON nesneleri için SQL örnekleri sunulmaktadır.
-
CSV
Kullanım durumu
SQL deyimi
İlk 10 satır veriyi döndürün.
select * from ossobject limit 10
Birinci sütundaki değer üçüncü sütundaki değerden büyük olduğunda, birinci ve üçüncü sütunlardan tam sayıları döndürün.
select _1, _3 from ossobject where cast(_1 as int) > cast(_3 as int)
Birinci sütunda 'Chen' ile başlayan kayıtların sayısını döndürün. (Not: 'like' ifadesinden sonraki Çince karakter UTF-8 olarak kodlanmalıdır.)
select count(*) from ossobject where _1 like 'Chen%'
İkinci sütundaki zaman damgası 2018-08-09 11:30:25'ten sonra olan ve üçüncü sütundaki değer 200'den büyük olan tüm kayıtları döndürün.
select * from ossobject where _2 > cast('2018-08-09 11:30:25' as timestamp) and _3 > 200
İkinci sütundaki ondalık sayıların ortalamasını, toplamını, maksimum ve minimum değerlerini döndürün.
select AVG(cast(_6 as double)), SUM(cast(_6 as double)), MAX(cast(_6 as double)), MIN(cast(_6 as double)) from ossobject
Birinci ve üçüncü sütunlardan birleştirilen dize 'Tom' ile başlayıp 'Anderson' ile biten tüm kayıtları döndürün.
select * from ossobject where (_1 || _3) like 'Tom%Anderson'
Birinci sütundaki değer 3'e bölünebilen tüm kayıtları döndürün.
select * from ossobject where (_1 % 3) = 0
Birinci sütundaki değer 1995 ile 2012 arasında olan tüm kayıtları döndürün.
select * from ossobject where _1 between 1995 and 2012
Beşinci sütundaki değer 'N', 'M', 'G' veya 'L' olan tüm kayıtları döndürün.
select * from ossobject where _5 in ('N', 'M', 'G', 'L')
İkinci ve üçüncü sütunlardaki değerlerin çarpımı, 100 ile beşinci sütundaki değerin toplamından büyük olan tüm kayıtları döndürün.
select from ossobject where _2 _3 > _5 + 100 -
JSON
Aşağıdaki JSON nesnesine sahip olduğunuzu varsayalım:
{ "contacts":[ { "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 27, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" }, { "type": "mobile", "number": "123 456-7890" } ], "children": [], "spouse": null },... # Additional contact nodes omitted for brevity. ]}Aşağıdaki tabloda SQL örnekleri verilmiştir.
Kullanım durumu
SQL deyimi
Yaş değeri 27 olan tüm kayıtları döndürün.
select from ossobject.contacts[] s where s.age = 27
Tüm ev telefon numaralarını döndürün.
select s.number from ossobject.contacts[].phoneNumbers[] s where s.type = "home"
Eşi null olan tüm kayıtları döndürün.
select * from ossobject s where s.spouse is null
Çocuğu olmayan tüm kayıtları döndürün.
select * from ossobject s where s.children[0] is null
NotBoş bir diziyi temsil etmek için özel bir sözdizimi yoktur. Bunun yerine önceki deyimi kullanın.
Kullanım durumları
SelectObject için yaygın kullanım durumları arasında büyük nesnelerin paralel olarak sorgulanması, JSON nesnelerinin sorgulanması ve günlük dosyalarının analizi yer alır.
-
Büyük nesneleri paralel olarak sorgulama
GetObject API tarafından sağlanan byte-range çok parçalı indirme özelliğine benzer şekilde, SelectObject API paralel sorguları destekler. Verileri iki yoldan biriyle bölebilirsiniz:
Satıra göre: Bu, verileri bölmenin yaygın bir yöntemidir. Ancak seyrek veriler için satıra göre bölme, sorgu çalışanları arasında dengesiz bir yüke neden olabilir.
Parçaya göre: Parça, veri parçalama için bir OSS kavramıdır. Bir parça birden çok satır içerir ve her parça yaklaşık olarak aynı boyuttadır.
NotVerileri parçaya göre bölmek, satıra göre bölmekten daha verimlidir.
CSV nesnenizdeki sütunların yeni satır karakterleri içermediğini doğrulayabiliyorsanız, meta veri oluşturmayı gerektirmediği için bayt aralığına göre bölme daha basittir. Sütunlar yeni satır karakterleri içeriyorsa veya bir JSON nesnesi sorguluyorsanız aşağıdaki adımları izleyin:
Nesne için toplam parça sayısını almak için CreateSelectObjectMeta API'sini çağırın. Tarama süresini azaltmak için sorguyu başlatmadan önce bu API'yi eşzamansız olarak çağırmanızı öneririz.
İstemci tarafındaki kaynaklarınıza bağlı olarak paralellik derecesini (n) belirleyin. Ardından, her bir paralel sorgunun işlemesi gereken parça sayısını hesaplamak için toplam parça sayısını n'ye bölün.
İstek gövdesinde sorgulanacak parça aralığını belirtin, örneğin
split-range=1-20.Tüm paralel sorgulardan gelen sonuçları birleştirin.
-
JSON nesnelerini sorgulama
JSON nesnelerini sorgularken performansı artırmak için FROM yan tümcesindeki JSON yolunu daraltın.
Aşağıdaki JSON nesne örneğini göz önünde bulundurun:
{ "contacts":[ { "firstName": "John", "lastName": "Smith", "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" }, "phoneNumbers": [ { "type": "home", "number": "212 555-1234" }, { "type": "office", "number": "646 555-4567" }, { "type": "mobile", "number": "123 456-7890" } ] } ]}Posta kodu '10021' ile başlayan tüm sokak adreslerini bulmak için SQL deyimini
select s.address.streetAddress from ossobject.contacts[*] s where s.address.postalCode like '10021%'veyaselect s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%'şeklinde yazabilirsiniz.JSON yolu daha kesin olduğu için ikinci deyim
select s.streetAddress from ossobject.contacts[*].address s where s.postalCode like '10021%'daha iyi performans gösterir. -
JSON nesnelerinde yüksek hassasiyetli ondalık sayıları işleme
Bir JSON nesnesinde yüksek hassasiyetli ondalık sayılarla hesaplama yapmanız gerektiğinde,
ParseJsonNumberAsStringseçeneğinitrueolarak ayarlamanız ve ardından değeri decimal türüne dönüştürmenizi öneririz. Örneğin, biraözniteliğinin değeri 123456789.123456789 ise, orijinal verinin hassasiyetini korumak içinselect s.a from ossobject s where cast(s.a as decimal) > 123456789.12345deyimini kullanabilirsiniz.
Yordam
OSS konsolu
OSS SDK'ları
ossutil CLI
API başvurusu
Yukarıda açıklanan işlemler temel SelectObject API'sine dayanır. Gelişmiş gereksinimleriniz varsa doğrudan REST API istekleri yapabilirsiniz. Doğrudan istek yaptığınızda kimlik doğrulama imzasını manuel olarak hesaplamanız gerekir. Daha fazla bilgi için bkz. SelectObject.
> Select Content