Bu konu, tablolarda Veri İşleme Dili (DML) işlemlerinin gerçekleştirilmesiyle ilgili sık sorulan soruları (SSS) yanıtlar.
|
Kategori |
SSS |
|
Veri ekleme veya güncelleme |
|
|
Veri silme |
Bir INSERT işlemi sırasında hata oluşursa orijinal veriler bozulur mu?
Hayır, orijinal veriler bozulmaz. MaxCompute atomikliği garanti eder. Bir INSERT işlemi başarılı olursa veriler güncellenir. İşlem başarısız olursa veriler geri alınır.
INSERT INTO veya INSERT OVERWRITE deyimi çalıştırıldığında Table xxx has n columns, but query has m columns hatası alınırsa ne yapılmalıdır?
INSERT INTO veya INSERT OVERWRITE deyimi çalıştırarak veri eklerken SELECT yan tümcesindeki alanların hedef tablodaki alanlarla eşleştiğinden emin olun. Alan sayısı, sırası ve veri türü eşleşmelidir. MaxCompute, diğer alanları NULL veya varsayılan değerlerine ayarlarken tablonun belirli alanlarına veri eklemeyi desteklemez. Bunu gerçekleştirmek için SELECT yan tümcesinde değerleri NULL olarak ayarlayın. Örneğin, select 'a', null, col_name from table_name;.
INSERT INTO veya INSERT OVERWRITE deyimi çalıştırıldığında "a single instance cannot output data to more than 10000 partitions" hatası alınırsa ne yapılmalıdır?
-
Belirtiler
INSERT INTO veya INSERT OVERWRITE deyimi çalıştırıldığında aşağıdaki hata döndürülür.
FAILED: ODPS-0123031:Partition exception - a single instance cannot output data to more than 10000 partitions -
Neden
Bir MaxCompute tablosu en fazla 60.000 bölüme sahip olabilir. Ancak tek bir iş, çıktı tablosunda en fazla 10.000 bölüme veri yazabilir. Bu hata genellikle bölüm alanının yanlış ayarlanmasından kaynaklanır. Örneğin, bir tabloyu ID alanına göre bölümlemek çok sayıda bölüm oluşturabilir.
-
Çözüm
Birkaç bin dinamik bölüm üreten bir iş büyük kabul edilir. Bir iş 10.000'den fazla bölüm üretirse bu durum iş mantığında veya SQL sözdiziminde bir sorun olduğunu gösterebilir. Mantığın ve sözdiziminin doğru olduğunu onaylarsanız bölümleme tablosunun bölüm alanını değiştirerek veya iş mantığını birden çok işe bölerek bu hatayı önleyebilirsiniz.
MaxCompute tablosunun dinamik bölümüne veri eklenirken "invalid dynamic partition value" hatası alınırsa ne yapılmalıdır?
-
Belirtiler
Dinamik bir bölüme veri eklerken aşağıdaki hata döndürülür.
FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=Shanghai -
Neden
Bu hata, dinamik bir bölüm için geçersiz bir değer kullanıldığından oluşur. Dinamik bölümleme, belirtilen alanlara göre bölümler oluşturur. Bu bölüm alanlarının değerleri özel karakterler veya Çince karakterler içeremez.
-
Çözüm
Dinamik bölümlere veri eklerken aşağıdaki hususlara dikkat edin:
Dağıtılmış bir ortamda dinamik bölümlere veri eklerken tek bir işlem en fazla 512 dinamik bölüm üretebilir.
Bir dinamik bölüm SQL deyimi 2.000'den fazla dinamik bölüm oluşturamaz.
Dinamik olarak oluşturulan bölüm değerleri NULL olamaz.
Hedef tabloda birden fazla bölüm düzeyi varsa INSERT deyimi çalıştırırken bazı bölümleri statik olarak belirtebilirsiniz. Ancak statik bölümler üst düzey bölümler olmalıdır.
MaxCompute tablosuna FLOAT veri eklenirken hata alınırsa ne yapılmalıdır?
MaxCompute V2.0'ın desteklediği temel veri türleri hakkında daha fazla bilgi için bkz. Veri türü sürümleri. FLOAT veri türünün sabit tanımı yoktur. FLOAT veri eklemek için veri türünü dönüştürmek üzere CAST işlevini kullanın. Örneğin, cast(5.1 as float) ifadesi '5.1' dizesini 5.1 FLOAT değerine dönüştürür.
MaxCompute SQL'de TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP veya BINARY gibi yeni veri türlerini kullanırken bunlardan birini kullanarak etkinleştirmeniz gerekir:
Oturum düzeyi: SQL deyiminden önce
set odps.sql.type.system.odps2=true;ekleyin ve bunları birlikte gönderin.Proje düzeyi: Proje sahibi, proje için yeni veri türlerini etkinleştirmek üzere
setproject odps.sql.type.system.odps2=true;komutunu çalıştırır.
Aynı veriler için INSERT SELECT ve SELECT işlemlerinin sonuçları neden farklıdır?
-
Belirtiler
Aynı STRING alanında SQL deyimleri çalıştırıldığında ondalık basamak sayısı tutarsızdır. SELECT işlemi iki ondalık basamağı korurken INSERT SELECT işlemi birden fazla ondalık basamak gösterir.
-
Nedenler
INSERT SELECT işleminde bir STRING alanı örtük olarak DECIMAL türüne dönüştürüldüğünde değer önce DOUBLE türüne dönüştürülür ardından ROUND işlemi gerçekleştirilir. DOUBLE türü hassas olmadığından ROUND işleminin sonucu hala birden fazla ondalık basamağa sahip olabilir.
-
Çözüm
Açık dönüşüm kullanın.
CASTişlevini kullanarak veriyi açıkçaDECIMALtürüne dönüştürün.case when pcm.abc is null then 0 else round(cast(pcm.abc as decimal) ,2) end abc
Hedef tablodaki bir alanın veri türü VARCHAR(10) ise, ekleme işlemi sırasında veri taşması oluştuğunda hata bildirilir mi?
Hayır. VARCHAR(10) veri türündeki bir alana veri eklerken uzunluk sınırı aşılırsa veriler kırpılır.
MaxCompute SQL deyimi çalıştırıldığında "Transaction timeout because cannot acquire exclusive lock" hatası alınırsa ne yapılmalıdır?
-
Belirtiler
Bir MaxCompute SQL deyimi yürütülürken aşağıdaki hata oluşur.
Failed to run ddltask - Modify DDL meta encounter exception : ODPS-0121096:MetaStore transaction conflict - Reached maximum retry times because of OTSStorageTxnLockKeyFail(Inner exception: Transaction timeout because cannot acquire exclusive lock.) -
Neden
MaxCompute, birden çok işin tek bir tabloya eşzamanlı olarak veri yazmasına olanak tanır. Birden çok iş aynı anda meta veri taahhüt aşamasına girdiğinde her işin tablonun meta verileri üzerinde kilit edinmesi, üzerine yazması ve kilidi serbest bırakması gerekir. Çok sayıda iş bunu aynı anda denediğinde meta veriler uzun süre kilitli kalabilir. Bu durum diğer işlerin kilidi edinmeyi beklerken zaman aşımına uğramasına ve
cannot acquire exclusive lockhatasının oluşmasına neden olur. Bir iş yaklaşık 30 saniye içinde kilit edinemiyorsa zaman aşımına uğrar. Kilit ayrıntı düzeyi tablo düzeyindedir. -
Çözüm
Aynı tablo veya tablo bölümünde eşzamanlı olarak birden fazla okuma ve yazma işlemi yapılıp yapılmadığını kontrol edin. Bir tablo veya tablo bölümünde eşzamanlı olarak birden fazla okuma ve yazma işlemi gerçekleştirmekten kaçının.
MaxCompute tablosundaki veya bölümündeki veriler nasıl güncellenir?
MaxCompute, update işlemini kullanarak işlem tablolarındaki verilere satır düzeyinde güncellemeler yapılmasını destekler.
İşlem dışı bir tabloda update işlemi çalıştırırsanız trying to update a non-transactional table is not allowed. Set tblproperties ("transactional" = "true") to use this feature hatası raporlanır.
Kaynak bölümden veya tablodan verileri hedef bölüme veya tabloya aktarabilir ve aktarma sırasında güncelleme işlemlerini yürütebilirsiniz. Hedef, kaynak da olabilir; buna yerinde güncelleme denir.
İşlem tablosu oluşturma hakkında daha fazla bilgi için bkz. Tablo işlemleri. MaxCompute, işlem özelliğini yalnızca tablo oluştururken ayarlamanıza olanak tanır. Mevcut bir tablonun işlem özelliğini değiştirmek için alter table kullanamazsınız.
MaxCompute tablosundan veya bölümünden veriler nasıl silinir?
MaxCompute, delete işlemini kullanarak işlem tablolarındaki verilere satır düzeyinde silme işlemleri yapılmasını destekler.
Tablo işlem tablosu değilse verileri aşağıdaki yollarla silebilirsiniz:
DROPkomutunu çalıştırarak tüm tabloyu silin.-
Bölümlenmemiş bir tablo için tablodan tüm verileri silmek üzere
truncate table table_name;komutunu çalıştırın veya benzer bir sonuç elde etmek içininsert overwritekomutunu kullanın.-
Örnek 1:
TableAtablosundanCol=1olan verileri silin.insert overwrite table TableA select a,b,c.... from TableA where Col <> 1; -
Örnek 2: Tüm verileri silin.
insert overwrite table TableA select a,b,c.... from TableA where 1=2;
-
-
Bölümlenmiş bir tablo için ilgili bölümü silmek üzere
alter table table_name drop if exists partition(partition_name='specific_partition_value')komutunu çalıştırın.Örneğin,
testtabletablosunun bölüm anahtar sütunudsşeklindedir.ds='20170520'bölümünü silmek için aşağıdaki komutu çalıştırın.alter table testtable drop if exists partition (ds='20170520'); -
WHERE yan tümceli bir INSERT deyimi kullanarak gerekli verileri yeni bir bölüme veya tabloya aktarın. INSERT deyiminin kaynak tablosu ve hedef tablosu aynı olabilir.
insert overwrite table sale_detail select * from sale_detail where name='mengyonghui';
Bölümlenmemiş bir tabloda büyük miktarda veri varsa yinelenen veriler nasıl silinir?
Yinelenen satırlardaki tüm sütunlar özdeşse tüm sütunlarda GROUP BY işlemi gerçekleştirebilirsiniz. Örneğin, bölümlenmemiş table1 tablosunda c1, c2 ve c3 sütunları varsa aşağıdaki komutu çalıştırabilirsiniz.
insert overwrite table table1 select c1, c2, c3 from table1 group by
c1, c2, c3;
Bu işlemi gerçekleştirmeden önce verilerinizi yedekleyin. Veri hacmine göre bu yöntemin maliyetinin verileri yeniden içe aktarma maliyetinden düşük olup olmadığını değerlendirin.