Bu konu, uyumsuz SQL ifadelerinin nasıl değiştirileceğini açıklar.
Arka plan bilgileri
MaxCompute V2.0, açık kaynak ekosistemini tam olarak benimser. Daha fazla dil özelliğini destekler ve daha hızlı çalışır. Ancak MaxCompute V2.0 daha sıkı sözdizimi denetimleri uygular. Önceki derleyici sürümlerinde başarıyla çalışan, sözdizimi belirsiz olan sorgular MaxCompute V2.0'da hatalara neden olabilir.
group.by.with.star
Açıklama: Bu sorun, bir select * …group by… ifadesi kullandığınızda ortaya çıkar.
MaxCompute V2.0'da
GROUP BYlistesi kaynak tablodaki tüm sütunları içermelidir. Aksi takdirde hata oluşur.MaxCompute'in önceki sürümleri,
GROUP BYlistesi kaynak tablodaki tüm sütunları içermese bileselect * from ... group by keysözdizimini destekler.
Örnekler
-
Senaryo 1: GROUP BY anahtarı, kaynak tablodaki tüm sütunları içermiyor.
-
Hatalı sözdizimi
select * from t group by key; -
Hata iletisi
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - column reference t.value should appear in GROUP BY key -
Doğru sözdizimi
select distinct key from t;
-
-
Senaryo 2: GROUP BY anahtarı tüm sütunları içeriyor.
-
Aşağıdaki sözdizimi önerilmez.
select * from t group by key, value; -- t has columns key and value -
Bu sözdizimi MaxCompute V2.0'da hataya neden olmasa da ifadeyi aşağıdaki gibi değiştirmenizi öneririz.
select distinct key, value from t;
-
bad.escape
Açıklama: Bu sorun, yanlış kaçış dizileriyle ilgilidir.
MaxCompute kurallarına göre dize değişmezinizde 0 ile 127 arasındaki ASCII karakterlerini temsil etmek için bir ters eğik çizgi ve ardından üç basamaklı sekizlik sayı kullanmanız gerekir. Örneğin, 0 ve 1'i temsil etmek için "\001" ve "\002" kullanabilirsiniz. Ancak önceki sürümler \01 ve \0001 değerlerini de \001 olarak işliyordu.
Bu davranış kafa karıştırıcı olabilir. Örneğin, "\0001" ifadesini "\000" sonrasına gelen "1" olarak temsil etmek için kullanamazsınız. Diğer sistemlerden geçiş yapan kullanıcılar için bu davranış doğruluk hatalarına da neden olabilir.
\000 değerine bir sayı eklemek (örneğin \0001 - \0009 veya \00001) hataya neden olabilir.
MaxCompute V2.0 bu sorunu çözer. Komut dosyalarınızdaki yanlış dizileri değiştirmeniz gerekir.
-
Hatalı sözdizimi
select split(key, "\01"), value like "\0001" from t; -
Hata iletisi
FAILED: ODPS-0130161:[1,19] Parse exception - unexpected escape sequence: 01 ODPS-0130161:[1,38] Parse exception - unexpected escape sequence: 0001 -
Doğru sözdizimi
select split(key, "\001"), value like "\001" from t;
column.repeated.in.creation
Açıklama: MaxCompute V2.0'da bir tablo oluştururken yinelenen sütun adları kullanılırsa hata oluşur.
Örnek
-
Hatalı sözdizimi
create table t (a BIGINT, b BIGINT, a BIGINT); -
Hata iletisi
FAILED: ODPS-0130071:[1,37] Semantic analysis exception - column repeated in creation: a -
Doğru sözdizimi
create table t (a BIGINT, b BIGINT);
string.join.double
Açıklama: Bu sorun, eşittir işaretinin sol tarafının STRING türünde, sağ tarafının ise DOUBLE türünde olduğu bir JOIN koşulunda ortaya çıkar.
MaxCompute'in önceki sürümleri her iki tarafı da
BIGINTtürüne dönüştürür. Bu dönüşüm önemli bir hassasiyet kaybına neden olabilir. Örneğin,1.1="1"join koşulu doğru kabul edilir.Hive ile uyumluluk sağlamak amacıyla MaxCompute V2.0 her iki tarafı da
DOUBLEtürüne dönüştürür.
Örnek
-
Önerilmez
select * from t1 join t2 on t1.double_value = t2.string_value; -
Uyarı iletisi
WARNING:[1,48] implicit conversion from STRING to DOUBLE, potential data loss, use CAST function to suppress -
Önerilen sözdizimi
select * from t1 join t2 on t.double_value = cast(t2.string_value as double);
window.ref.prev.window.alias
Açıklama: Bu sorun, bir pencere işlevinin aynı SELECT listesindeki başka bir pencere işlevinin takma adına başvurması durumunda ortaya çıkar.
Örnek
-
t1içindernyoksa aşağıdaki sözdizimi yanlıştır.select row_number() over (partition by c1 order by c1) rn, row_number() over (partition by c1 order by rn) rn2 from t1; -
Hata iletisi
FAILED: ODPS-0130071:[2,45] Semantic analysis exception - column rn cannot be resolved -
Doğru sözdizimi
select row_number() over (partition by c1 order by rn) rn2 from (select c1, row_number() over (partition by c1 order by c1) rn from t1 ) tmp;
select.invalid.token.after.star
Açıklama: Bir SELECT listesinde bir tablodaki tüm sütunları seçmek için yıldız işareti () kullanabilirsiniz. Ancak yıldız işaretinden () sonra bir alias ekleyemezsiniz. Yıldız işareti (*) yalnızca tek bir sütuna genişlese bile bu sözdizimine izin verilmez. MaxCompute V2.0 derleyicisi bu sözdizimi için hata bildirir.
Örnek
-
Hatalı sözdizimi
select * as alias from table_test; -
Hata iletisi
FAILED: ODPS-0130161:[1,10] Parse exception - invalid token 'as' -
Doğru sözdizimi
select * from table_test;
agg.having.ref.prev.agg.alias
Açıklama: Bu sorun, SELECT listesinin önceki bir toplama işlevinin takma adına başvurması ve bir HAVING yan tümcesinin mevcut olması durumunda ortaya çıkar.
Örnek
-
Hatalı sözdizimi
select count(c1) cnt, sum(c1) / cnt avg from t1 group by c2 having cnt > 1; -
Hata iletisi
FAILED: ODPS-0130071:[2,11] Semantic analysis exception - column cnt cannot be resolved ODPS-0130071:[2,11] Semantic analysis exception - column reference cnt should appear in GROUP BY keyBu örnekte
svecntkaynak tablot1içinde mevcut değildir. MaxCompute'in önceki sürümleriHAVINGyan tümcesi nedeniyle hata bildirmiyordu. MaxCompute V2.0 ise bircolumn cannot be resolvedhatası bildirir. -
Doğru sözdizimi
select cnt, s, s/cnt avg from ( select count(c1) cnt, sum(c1) s from t1 group by c2 having count(c1) > 1 ) tmp;
order.by.no.limit
Açıklama: MaxCompute varsayılan olarak döndürülen sonuç sayısını sınırlamak için bir limit yan tümcesini bir order by yan tümcesinden sonra eklemenizi gerektirir. order by işlemi tam sıralama gerçekleştirdiğinden ve bir limit yan tümcesi kullanılmadığında yürütme performansı düşük olduğundan bu gereklilik vardır.
Örnek
-
Hatalı sözdizimi
select * from (select * from (select cast(login_user_cnt as int) as uv, '3' as shuzi from test_login_cnt where type = 'device' and type_name = 'mobile') v order by v.uv desc) v order by v.shuzi limit 20; -
Hata iletisi
FAILED: ODPS-0130071:[4,1] Semantic analysis exception - ORDER BY must be used with a LIMIT clause
order by v.uv desc alt sorgusuna bir limit yan tümcesi ekleyin.
Ek olarak MaxCompute V1.0 görünümleri denetlerken katı değildir. Örneğin, limit denetiminin gerekli olmadığı bir projede odps.sql.validate.orderby.limit=false ayarını yaparak bir görünüm oluşturabilirsiniz.
create view table_view as select id from table_view order by id;
Bu görünüme erişmek için:
select * from table_view;
MaxCompute V1.0 hata bildirmez. MaxCompute V2.0 ise aşağıdaki hata iletisini bildirir:
FAILED: ODPS-0130071:[1,15] Semantic analysis exception - while resolving view xdj.xdj_view_limit - ORDER BY must be used with a LIMIT clause
generated.column.name.multi.window
Açıklama: Bu sorun, otomatik olarak oluşturulan aliases kullanımını içerir.
MaxCompute'in önceki sürümleri bir SELECT ifadesindeki her ifade için otomatik olarak bir takma ad oluşturur. Bu takma ad konsolda görüntülenir. Ancak bu takma adı oluşturma kuralları garanti edilmez ve değişebilir. Bu nedenle otomatik olarak oluşturulan takma adları kullanmamalısınız.
MaxCompute V2.0 otomatik olarak oluşturulan takma adlar kullanıldığında uyarı verir. Bu uygulama yaygın olarak kullanıldığından şu an için engellenemez.
Bazı durumlarda MaxCompute sürümleri arasında takma ad oluşturma kuralları değişir. Bazı çevrimiçi işler bu takma adlara dayandığından bu sorgular MaxCompute sürüm yükseltmesi veya geri alma sırasında başarısız olabilir. Bu sorunla karşılaşırsanız kullanmak istediğiniz sütunlar için takma adları açıkça belirtmek üzere sorgularınızı değiştirmeniz gerekir.
Örnek
-
Önerilmez
select _c0 from (select count(*) from table_name) t; -
Önerilen sözdizimi:
select c from (select count(*) c from table_name) t;
non.boolean.filter
BOOLEAN olmayan bir filtre koşulu kullanımıyla ilgili sorun.
MaxCompute Boolean türleri ile diğer veri türleri arasında örtük dönüştürmelere izin vermez. Ancak MaxCompute'in önceki sürümleri bazı durumlarda BIGINT türünü filtre koşulu olarak kullanmanıza olanak tanır. MaxCompute V2.0 artık bu davranışa izin vermez. Komut dosyalarınız bu tür filtre koşulları içeriyorsa bunları değiştirmeniz gerekir. Aşağıda bir örnek verilmiştir:
Hatalı sözdizimi:
select id, count(*) from table_name group by id having id;
Hata iletisi:
FAILED: ODPS-0130071:[1,50] Semantic analysis exception - expect a BOOLEAN expression
Doğru yöntem aşağıdaki gibidir:
select id, count(*) from table_name group by id having id <> 0;
post.select.ambiguous
order by, cluster by, distribute by veya sort by ifadelerinde çakışan ada sahip sütunların referans alınmasıyla ilgili sorun.
MaxCompute'in önceki sürümlerinde sistem varsayılan olarak işlem nesnesi olarak SELECT listesindeki son sütunu seçer. MaxCompute V2.0 hata bildirir. İfadelerinizi değiştirmeniz gerekir. Aşağıda bir örnek verilmiştir:
Hatalı sözdizimi:
select a, b as a from t order by a limit 10;
Hata iletisi:
FAILED: ODPS-0130071:[1,34] Semantic analysis exception - a is ambiguous, can be both t.a or null.a
Aşağıda doğru düzeltme gösterilmektedir:
select a as c, b as a from t order by a limit 10;
Bu değişiklik adların çakıştığı ancak anlamların aynı olduğu durumları da kapsar. Bu durum belirsizliğe neden olmasa da bu sözdizimi kolayca hatalara yol açabileceğinden düzeltmeler yapmanız için bir uyarı bildirilir.
duplicated.partition.column
Bir sorguda aynı ada sahip bölümlerin belirtilmesiyle ilgili sorun.
MaxCompute'in önceki sürümleri aynı ada sahip bir bölüm anahtarı belirttiğinizde hata bildirmezdi. Bunun yerine sonraki anahtarın değeri önceki anahtarın değerinin üzerine yazılırdı. Bu davranış kolayca kafa karışıklığına neden olabilirdi. MaxCompute V2.0 bu durum için hata bildirir. Aşağıdaki örnekler sorunu göstermektedir:
Hatalı sözdizimi 1:
insert overwrite table partition (ds = '1', ds = '2')select ... ;
Çalışma zamanında ds = ‘1’ yoksayılır.
Doğru yöntem aşağıdaki gibidir:
insert overwrite table partition (ds = '2')select ... ;
Hatalı sözdizimi 2:
create table t (a bigint, ds string) partitioned by (ds string);
Doğru yordam:
create table t (a bigint) partitioned by (ds string);
order.by.col.ambiguous
select listesinde yinelenen bir takma ad bulunması ve bunun daha sonra bir order by yan tümcesi tarafından referans alınmasıyla ilgili sorun.
Hatalı sözdizimi:
select id, id
from table_test
order by id;
Doğru yöntem aşağıdaki gibidir:
select id, id id2
from table_name
order by id;
order by yan tümcesinde referans almadan önce yinelenen takma adı kaldırın.
in.subquery.without.result
colx in subquery ifadesi sonuç döndürmediğinde colx öğesinin kaynak tabloda mevcut olmadığı bildirilmesiyle ilgili sorun.
Hatalı sözdizimi:
select * from table_name
where not_exist_col in (select id from table_name limit 0);
Hata iletisi:
FAILED: ODPS-0130071:[2,7] Semantic analysis exception - column not_exist_col cannot be resolved
ctas.if.not.exists
Hedef tablo için hatalı sözdizimiyle ilgili sorun.
Hedef tablo zaten varsa MaxCompute'in önceki sürümleri sözdizimi denetimi gerçekleştirmez. MaxCompute V2.0 normal sözdizimi denetimi gerçekleştirir. Bu değişiklik birçok hata iletisine neden olabilir. Aşağıda bir örnek verilmiştir:
Hatalı sözdizimi:
create table if not exists table_name
as
select * from not_exist_table;
Hata iletisi:
FAILED: ODPS-0130131:[1,50] Table not found - table meta_dev.not_exist_table cannot be resolved
worker.restart.instance.timeout
MaxCompute'in önceki sürümlerinde Kullanıcı Tanımlı İşlev (UDF) tarafından çıktılanan her kayıt dağıtılmış dosya sistemine bir yazma işlemi tetikler ve Fuxi'ye bir kalp atışı gönderir. UDF 10 dakika boyunca herhangi bir sonuç çıkarmazsa aşağıdaki hata iletisini alırsınız:
FAILED: ODPS-0123144: Fuxi job failed - WorkerRestart errCode:252,errMsg:kInstanceMonitorTimeout, usually caused by bad udf performance.
MaxCompute V2.0'nın çalışma zamanı çerçevesi vektörleştirmeyi destekler. Vektörleştirme yürütme verimliliğini artırmak için bir sütunun birden çok satırını aynı anda işler. Ancak vektörleştirme daha önce hatasız çalışan ifadelerin zaman aşımına uğramasına neden olabilir. İki kaydın çıktısı arasındaki aralık 10 dakikadan azsa bu sorun ortaya çıkabilir. Birden çok satır aynı anda işlendiğinden kalp atışları Fuxi'ye zamanında gönderilmeyebilir.
Bu hatayla karşılaşırsanız öncelikle UDF'nizin performans sorunları olup olmadığını kontrol edin (örneğin her kaydın işlenmesinin birkaç saniye sürmesi). UDF performansını optimize edemiyorsanız toplu iş satırı boyutunu manuel olarak ayarlayarak sorunu çözmeyi deneyebilirsiniz. Varsayılan değer 1024'tür.
set odps.sql.executionengine.batch.rowcount=16;
divide.nan.or.overflow
MaxCompute'in önceki sürümlerinin bölme işlemi için sabit katlama gerçekleştirmemesiyle ilgili sorun.
Örneğin aşağıdaki ifade için MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı şu şekildedir:
explain
select if(false, 0/0, 1.0)
from table_name;
in task M1_Stg1:
Data source: meta_dev.table_name
TS: alias: table_name
SEL: If(False, Divide(UDFToDouble(0), UDFToDouble(0)), 1.0)
FS: output: None
Gördüğünüz gibi IF ve Divide işlevleri korunur. Çalışma zamanında IF işlevinin ilk parametresi false olduğundan ikinci parametredeki Divide ifadesi değerlendirilmez. Bu nedenle sıfıra bölme istisnası oluşmaz.
Ancak MaxCompute V2.0 bölme işlemi için sabit katlamayı destekler ve aşağıdaki örnekte gösterildiği gibi hata bildirir:
Hatalı sözdizimi:
select IF(FALSE, 0/0, 1.0)
from table_name;
Hata iletisi:
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result NaN, two params are 0.000000 and 0.000000
Yukarıdaki hataya ek olarak taşma hatasıyla da karşılaşabilirsiniz. Örneğin:
Hatalı sözdizimi:
select if(false, 1/0, 1.0)
from table_name;
Hata iletisi:
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result overflow, two params are 1.000000 and 0.000000
Doğru yöntem aşağıdaki gibidir:
/0 kullanımını kaldırın ve geçerli bir sabitle değiştirin.
CASE WHEN sabit katlamada benzer bir sorun vardır. Örneğin CASE WHEN TRUE THEN 0 ELSE 0/0 ifadesinde MaxCompute V2.0 sabit katlama sırasında tüm alt ifadeleri değerlendirir. Bu durum sıfıra bölme hatasına neden olur.
CASE WHEN daha karmaşık optimizasyon senaryolarını içerebilir. Örneğin:
select case when key = 0 then 0 else 1/key end
from (
select 0 as key from src
union all
select key from src) r;
Optimizasyon aracı bölme işlemini alt sorguya iter. Dönüşüm aşağıdakine benzer:
M (
select case when 0 = 0 then 0 else 1/0 end c1 from src
UNION ALL
select case when key = 0 then 0 else 1/key end c1 from src) r;
Hata iletisi:
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.ArithmeticException: DIVIDE func result overflow, two params are 1.000000 and 0.000000
Bu durumda UNION ALL öğesinin ilk yan tümcesi için sabit katlama hata bildirir. Bu sorunu çözmek için SQL ifadesindeki CASE WHEN yan tümcesini alt sorguya taşıyın, gereksiz CASE WHEN yan tümcesini kaldırın ve /0 kullanımını kaldırın:
select c1 end
from (
select 0 c1 end from src
union all
select case when key = 0 then 0 else 1/key end) r;
small.table.exceeds.mem.limit
MaxCompute'in önceki sürümleri Çok Yönlü Join (Multi-way Join) optimizasyonunu destekler. Aynı join anahtarını kullanan birden çok join tek bir Fuxi görevinde birleştirilir. Aşağıdaki sorgudaki J4_1_2_3_Stg1 buna bir örnektir:
explain
select t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;
MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı:
In Job job0:
root Tasks: M1_Stg1, M2_Stg1, M3_Stg1
J4_1_2_3_Stg1 depends on: M1_Stg1, M2_Stg1, M3_Stg1
In Task M1_Stg1:
Data source: meta_dev.t1
In Task M2_Stg1:
Data source: meta_dev.t2
In Task M3_Stg1:
Data source: meta_dev.t3
In Task J4_1_2_3_Stg1:
JOIN: t1 INNER JOIN unknown INNER JOIN unknown
SEL: t1._col0, t1._col1, t1._col2
FS: output: None
Bir MapJoin ipucu eklerseniz MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı değişmez. Bu durum MaxCompute'in önceki sürümlerinin Çok Yönlü Join optimizasyonuna öncelik verdiğini ve kullanıcı tarafından belirtilen MapJoin ipuçlarını yoksayabileceğini gösterir.
explain
select /* +mapjoin(t1) */ t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;
MaxCompute'in önceki sürümlerindeki fiziksel yürütme planı yukarıdaki planla aynıdır.
MaxCompute V2.0 optimizasyon aracı kullanıcı tarafından belirtilen MapJoin ipuçlarına öncelik verir. Yukarıdaki örnekte t1 büyükse aşağıdakine benzer bir hatayla karşılaşabilirsiniz:
FAILED: ODPS-0010000:System internal error - SQL Runtime Internal Error: Hash Join Cursor HashJoin_REL… small table exceeds, memory limit(MB) 640, fixed memory used …, variable memory used …
Bu durumda MapJoin davranışı beklediğiniz gibi değilse MapJoin ipucunu kaldırabilirsiniz.
sigkill.oom
small.table.exceeds.mem.limit sorununa benzer şekilde bir MapJoin ipucu belirtirseniz ve belirtilen küçük tablo büyükse Çok Yönlü Join olarak optimize edildiğinden sorgu MaxCompute'in önceki sürümlerinde başarılı olabilir. MaxCompute V2.0'da küçük tablonun bellek sınırını aşmasından kaynaklanan hatalardan kaçınmak için odps.sql.mapjoin.memory.max ayarını yapabilirsiniz. Ancak her MaxCompute çalışanının sabit bir bellek sınırı vardır. Küçük tablo çok büyükse MaxCompute çalışanı bellek yetersizliği (OOM) hatası nedeniyle sonlandırılır. Hata aşağıdakine benzer:
Fuxi job failed - WorkerRestart errCode:9,errMsg:SigKill(OOM), usually caused by OOM(outof memory).
Bu durumda MapJoin ipucunu kaldırabilir ve Çok Yönlü Join kullanabilirsiniz.
wm_concat.first.argument.const
Toplama işlevleri bölümündeki WM_CONCAT açıklaması WM_CONCAT öğesinin ilk parametresinin her zaman bir sabit olması gerektiğini belirtir. MaxCompute'in önceki sürümleri bu denetim konusunda katı değildir. Örneğin kaynak tabloda veri yoksa WM_CONCAT öğesinin ilk parametresi bir ColumnReference olsa bile hata bildirilmez.
Function declaration:
string wm_concat(string separator, string str)
Parameter description:
separator: A constant of the String type. This is the separator. Other data types or non-constants will cause an exception.
MaxCompute V2.0 planlama aşamasında parametrelerin geçerliliğini denetler. WM_CONCAT öğesinin ilk parametresi bir sabit değilse hemen hata bildirilir. Aşağıda bir örnek verilmiştir:
Hatalı sözdizimi:
select wm_concat(value, ',') FROM src group by value;
Hata iletisi:
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.validator.AggregateCallValidator$AggregateCallValidationException: Invalid argument type - The first argument of WM_CONCAT must be constant string.
pt.implicit.convertion.failed
srcpt, iki bölümü olan bölümlenmiş bir tablodur:
create table srcpt(key STRING, value STRING) partitioned by (pt STRING);
alter table srcpt add partition (pt='pt1');
alter table srcpt add partition (pt='pt2');
Yukarıdaki SQL ifadesi için String türündeki pt sütunu ve INT türündeki sabitler karşılaştırma amacıyla her ikisi de DOUBLE türüne dönüştürülür. Proje odps.sql.udf.strict.mode=true olarak ayarlansa bile MaxCompute'in önceki sürümleri hata bildirmez. Tüm pt değerleri filtrelenir. MaxCompute V2.0 hata bildirir. Aşağıda bir örnek verilmiştir:
Hatalı sözdizimi:
select key from srcpt where pt in (1, 2);
Hata iletisi:
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.NumberFormatException: ODPS-0123091:Illegal type cast - In function cast, value 'pt1' cannot be casted from String to Double.
Bir STRING bölüm anahtarı sütununu INT türündeki sabitlerle karşılaştırmaktan kaçının. INT türündeki sabitleri STRING türüne değiştirmeniz gerekir.
having.use.select.alias
SQL spesifikasyonu GROUP BY ve HAVING yan tümcelerinin SELECT yan tümcesinden önce işlendiğini tanımlar. Bu nedenle HAVING yan tümcesi SELECT yan tümcesi tarafından oluşturulan bir sütun takma adını kullanamaz.
Örnek
-
Hatalı sözdizimi:
select id id2 from table_name group by id having id2 > 0; -
Hata iletisi:
FAILED: ODPS-0130071:[1,44] Semantic analysis exception - column id2 cannot be resolvedODPS-0130071:[1,44] Semantic analysis exception - column reference id2 should appear in GROUP BY keyBu örnekte
id2,SELECTyan tümcesinde oluşturulan yeni bir sütun takma adıdır veHAVINGyan tümcesinde kullanılamaz.
dynamic.pt.to.static
Açıklama: MaxCompute V2.0'da dinamik bölümler bazen optimizasyon aracı tarafından statik bölümlere dönüştürülür.
Örnek
insert overwrite table srcpt partition(pt) select id, 'pt1' from table_name;
ifadesi şuna dönüştürülür
insert overwrite table srcpt partition(pt='pt1') select id from table_name;
Geçersiz bir bölüm değeri (örneğin '${bizdate}' hatalı kullanımı) belirtirseniz MaxCompute V2.0 sözdizimi denetimi aşamasında hata bildirir. Daha fazla bilgi için bkz. Bölümler.
Hatalı sözdizimi:
insert overwrite table srcpt partition(pt) select id, '${bizdate}' from table_name limit 0;
Hata iletisi:
FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 2 in data source, requires 3 columns (includes dynamic partitions if any)
MaxCompute'in önceki sürümlerinde LIMIT 0 yan tümcesi nedeniyle SQL ifadesi herhangi bir veri çıkarmaz ve dinamik bölüm oluşturulmaz. Bu nedenle hata bildirilmez.
lot.not.in.subquery
Açıklama: Bu sorun bir IN alt sorgusunda NULL değerlerinin nasıl işlendiğiyle ilgilidir.
Standart SQL IN işlemlerinde değer listesi NULL içeriyorsa dönüş değeri false değildir. Dönüş değeri yalnızca NULL veya true olabilir. Örneğin 1 in (null, 1, 2, 3) ifadesi true, 1 in (null, 2, 3) ifadesi NULL ve null in (null, 1, 2, 3) ifadesi NULL döndürür. Benzer şekilde bir NOT IN işleminde liste NULL içeriyorsa dönüş değeri yalnızca false veya NULL olur ve asla true olmaz.
MaxCompute V2.0 bu sorunu standart SQL davranışına göre işler. Bu uyarıyı alırsanız IN işlemindeki alt sorgunun null değerler döndürüp döndürmediğini belirlemek için sorgularınızı kontrol edin. Null değerler oluştuğunda davranışın beklentinizle aynı olup olmadığını kontrol edin. Değilse gerekli değişiklikleri yapın.
Örnek
-
acceptedsütunuNULLdeğerler içermiyorsa bu sorunu yoksayabilirsiniz. Sütun null değerler içeriyorsa daha öncetruedöndürenc not in (select accepted from c_list)ifadesi artık MaxCompute V2.0'daNULLdöndürür.select * from t where c not in (select accepted from c_list); -
Doğru sözdizimi
select * from t where c not in (select accepted from c_list where accepted is not null)