Este tópico descreve as possíveis causas do código de erro ODPS-0130071 (exceção de análise semântica) e apresenta as soluções correspondentes.
Mensagem de erro 1: the number of input partition columns (n) doesn't equal to table's partition columns (m)
Exemplo
FAILED: ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)
Descrição
A tabela de destino da inserção é particionada e possui m campos de partição. No entanto, a instrução SQL executada especifica apenas n colunas de chave de partição (onde n < m). Consequentemente, a gravação dos dados na partição específica falha e o sistema retorna um erro.
Soluções
Modifique a instrução SQL para garantir que as colunas de chave de partição especificadas correspondam aos campos de partição da tabela.
Exemplos
-- Create a table.
CREATE TABLE if NOT EXISTS mf_sale_detail
(
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
partitioned BY
(
sale_date string,
region string
);
-- Error: The target table has two partition levels, but the PARTITION clause is either missing or incomplete.
INSERT overwrite TABLE mf_sale_detail
VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
FAILED: ODPS-0130071:[1,24] Semantic analysis exception - the number of input partition columns (0) doesn't equal to table's partition columns (2)
-- Correct: Specify all partitions in the PARTITION clause.
INSERT overwrite TABLE mf_sale_detail PARTITION(sale_date = '2013', region = 'china')
VALUES ('s1', 'c1', 100.1), ('s2', 'c2', 100.2), ('s3', 'c3', 100.3);
OK
-- Correct: Use dynamic partitioning.
INSERT overwrite TABLE mf_sale_detail PARTITION(sale_date = '2013', region)
VALUES ('s1', 'c1', 100.1, 'china'), ('s2', 'c2', 100.2, 'china'), ('s3', 'c3', 100.3, 'china');
OK
Mensagem de erro 2: expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Descrição
No MaxCompute SQL, o sort-merge join atua como algoritmo físico para operações de junção. A condição de junção deve incluir uma expressão de igualdade. Durante as consultas reais, o shuffling ocorre com base nas colunas das tabelas à esquerda e à direita presentes nessa expressão.
Soluções
Certifique-se de que a condição de junção contenha uma expressão de igualdade.
-
Adicione um map join hint.
NotaSe a condição ON contiver apenas uma expressão de não igualdade, a operação de junção poderá gerar um grande volume de dados, aumentando significativamente o tempo de execução da consulta.
Exemplos
-- Error: The join condition contains only a non-equality expression.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
FAILED: ODPS-0130071:[4,4] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
-- Correct: The join condition includes an equality expression (t1.key = t2.key) involving columns from both tables.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key AND t1.value > t2.value;
-- Correct: Add a mapjoin hint.
SELECT /*+mapjoin(t1)*/ t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
Mensagem de erro 3: insert into HASH CLUSTERED table/partition xxx is not current supported
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported
Descrição
A instrução INSERT INTO não permite gravar dados em uma tabela clusterizada.
Soluções
Converta a tabela em uma tabela comum.
Substitua a instrução INSERT INTO pela instrução INSERT OVERWRITE.
Exemplos
-- Create a clustered table.
CREATE TABLE sale_detail_hashcluster
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
)
clustered BY(customer_id)
sorted BY(customer_id)
INTO 1024 buckets;
-- Error: Using INSERT INTO with a clustered table.
INSERT INTO sale_detail_hashcluster
VALUES ('a', 123, 'id123');
FAILED: ODPS-0130071:[1,13] Semantic analysis exception - insert into HASH CLUSTERED table/partition meta.sale_detail_hashcluster is not current supported
-- Correct: Use INSERT INTO with a common table.
CREATE TABLE sale_detail
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
);
INSERT INTO sale_detail
VALUES ('a', 123, 'id123');
-- Correct: Use INSERT OVERWRITE with the clustered table.
INSERT overwrite TABLE sale_detail_hashcluster
VALUES ('a', 123, 'id123');
Mensagem de erro 4: should appear in GROUP BY key
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key
Descrição
A cláusula GROUP BY agrega dados na tabela de entrada com base na chave especificada. Após a agregação, aplicam-se as seguintes regras:
Para a coluna correspondente à chave de agregação, os valores de saída são obtidos diretamente. Também é possível chamar funções comuns (não agregadas) para processar e calcular adicionalmente os dados dessa coluna.
Nas colunas que não correspondem à chave de agregação, não é possível obter valores de saída diretamente. Utilize funções de agregação, como SUM, COUNT e AVG, para calcular os resultados agregados.
Soluções
Utilize funções de agregação como SUM, COUNT, AVG ou ANY_VALUE nas colunas que não correspondem à chave de agregação para calcular o resultado desejado.
Exemplos de instruções de consulta
-- Error: Column `c` is not in the GROUP BY key and is not used in an aggregate function.
SELECT a, sum(b), c
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
-- Error message is returned.
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - column reference t.c should appear in GROUP BY key
-- Correct: Use the aggregate function any_value() on column `c`.
SELECT a, sum(b), any_value(c)
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
Mensagem de erro 5: Invalid partition value
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'
Descrição
O valor de um campo de partição é inválido. Os valores dos campos de partição em uma tabela do MaxCompute devem obedecer às seguintes regras:
O valor de um campo de partição não pode conter caracteres de byte duplo, como caracteres chineses. O comprimento deve ser de 1 a 128 bytes, permitindo letras, dígitos e caracteres especiais suportados. O valor deve começar com uma letra.
Os caracteres permitidos incluem espaços, dois-pontos (:), sublinhados (_), cifrões ($), cerquilhas (#), pontos (.), pontos de exclamação (!) e arrobas (@). O comportamento de outros caracteres, como caracteres de escape
\t,\ne/, é indefinido.
Soluções
Altere o valor do campo de partição para um valor válido.
Exemplos de instruções de consulta
-- Create a table.
CREATE TABLE mc_test
(
a bigint
)
partitioned BY
(
ds string
);
-- Error: The partition value '${today}' is invalid.
ALTER TABLE mc_test ADD PARTITION(ds = '${today}');
-- Error message is returned.
FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'
-- Correct: Change the partition value to a valid one, such as '20221206'.
ALTER TABLE mc_test ADD PARTITION(ds='20221206');
Mensagem de erro 6: only oss external table support msck repair syntax
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax
Descrição
Apenas tabelas externas do Object Storage Service (OSS) suportam a instrução MSCK REPAIR TABLE. Para mais informações, consulte Tabelas externas ORC.
-
Método 1 (Recomendado): Descubra e adicione partições automaticamente.
Com este método, o MaxCompute adiciona automaticamente as partições ausentes a uma tabela externa do OSS com base na estrutura de diretórios no OSS. Essa abordagem é útil para backfill de um grande volume de partições históricas de uma só vez.
msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];Nota
Este método não é adequado para adicionar partições incrementais, especialmente quando um diretório do OSS contém muitas partições (por exemplo, mais de 1.000). Quando a quantidade de novas partições é muito menor que a de partições existentes, a execução frequente do comando
msckgera varreduras repetitivas do diretório OSS e solicitações de atualização de metadados. Isso reduz significativamente a eficiência da execução do comando. Portanto, para cenários que exigem adição de partições incrementais, recomenda-se o uso do Método 2. -
Método 2: Adicione partições manualmente.
Esta abordagem é recomendada para adicionar novas partições periodicamente após o carregamento inicial das partições históricas. Crie as novas partições antes de executar seus jobs de gravação de dados. Após a criação da partição, a tabela externa consegue ler os dados mais recentes do diretório OSS correspondente sem necessidade de atualizar a partição.
ALTER TABLE < mc_oss_extable_name >ADD PARTITION (< col_name >= < col_value >)[ ADD PARTITION (< col_name >= < col_value >)...][location URL];Os valores de col_name e col_value devem corresponder aos nomes dos diretórios dos arquivos de dados da partição. Por exemplo, considere a seguinte estrutura de diretórios no OSS: col_name corresponde a
direction, e col_value corresponde aN, NE, S, SW, W. Uma instruçãoadd partitioncorresponde a um subdiretório; portanto, múltiplos subdiretórios no OSS exigem múltiplas instruçõesadd partition.
Exemplo
-
Crie um diretório chamado
demo8no OSS. Em seguida, crie duas pastas de partição dentro desse diretório e coloque os arquivos correspondentes em cada uma.Pasta de partição:
$pt1=1/$pt2=2. Nome do arquivo:demo8-pt1.txt.Pasta de partição:
$pt1=3/$pt2=4. Nome do arquivo:demo8-pt2.txt.
Crie uma tabela externa e especifique os campos
pt.Caso os nomes das colunas de partição na tabela externa do OSS não correspondam à estrutura de diretórios do OSS, especifique o diretório explicitamente.
--Create an external table
create external table mf_oss_spe_pt (id int, name string)
partitioned by (pt1 string, pt2 string)
stored as TEXTFILE
location "oss://oss-cn-beijing-internal.aliyuncs.com/mfoss*******/demo8/";
--Specify the partition fields
MSCK REPAIR TABLE mf_oss_spe_pt ADD PARTITIONS
with PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
--Query data
select * from mf_oss_spe_pt where pt1=1 and pt2=2;
--Result
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 1 | kyle | 1 | 2 |
| 2 | nicole | 1 | 2 |
+------------+------------+------------+------------+
--Query data
select * from mf_oss_spe_pt where pt1=3 and pt2=4;
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 3 | john | 3 | 4 |
| 4 | lily | 3 | 4 |
+------------+------------+------------+------------+
--The mapping between MaxCompute partitions and OSS directories is as follows:
--pt1=8-->8
--pt2=8-->$pt2=8
--Add a partition
alter table mf_oss_spe_pt add partition (pt1=8,pt2=8)
location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo8/8/$pt2=8/';
--Disable commit mode and insert data
set odps.sql.unstructured.oss.commit.mode=false;
insert into mf_oss_spe_pt partition (pt1=8,pt2=8) values (1,'tere');
--Query data
set odps.sql.unstructured.oss.commit.mode=false;
select * from mf_oss_spe_pt where pt1=8 and pt2=8;
+------+------+-----+-----+
| id | name | pt1 | pt2 |
+------+------+-----+-----+
| 1 | tere | 8 | 8 |
+------+------+-----+-----+
Soluções
Crie uma tabela externa do OSS conforme descrito na documentação antes de executar o comando MSCK REPAIR.
Exemplos de instruções de consulta
--Create a common table
CREATE TABLE mc_test
(
a BIGINT
)
partitioned BY
(
ds string
);
--Error. A common table cannot perform the msck repair operation.
msck TABLE mc_test ADD partitions;
FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax
Mensagem de erro 7: column xx in source has incompatible type yy with destination column zz, which has type ttt
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt
Descrição
Ao inserir dados em uma tabela, o tipo de dado da tabela de destino deve corresponder ao tipo de dado inserido, ou o tipo de dado inserido deve ser implicitamente conversível para o tipo da tabela de destino. Caso contrário, o sistema retorna um erro.
Soluções
Modifique a instrução de consulta para garantir que o tipo de dado inserido seja compatível com o tipo de dado da tabela de destino.
Exemplos de instruções de consulta
-- Create a table.
odps> CREATE TABLE mc_test
(
a datetime
);
-- Error: The data types are incompatible.
odps> INSERT overwrite TABLE mc_test
VALUES (1L);
FAILED: ODPS-0130071:[2,9] Semantic analysis exception - column __value_col0 in source has incompatible type BIGINT with destination column a, which has type DATETIME
-- Correct: Insert data of the correct type.
odps> INSERT overwrite TABLE mc_test
VALUES (datetime '2022-12-06 14:23:45');
Mensagem de erro 8: function datediff cannot match any overloaded functions with (STRING, STRING, STRING), candidates are BIGINT DATEDIFF(DATE arg0, DATE arg1, STRING arg2); BIGINT DATEDIFF(DATETIME arg0, DATETIME arg1, STRING arg2); BIGINT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1, STRING arg2); INT DATEDIFF(DATE arg0, DATE arg1); INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)
Exemplo
ODPS-0130071:[m,n] Semantic analysis exception - function datediff cannot match any overloaded functions with (STRING, STRING, STRING), candidates are BIGINT DATEDIFF(DATE arg0, DATE arg1, STRING arg2); BIGINT DATEDIFF(DATETIME arg0, DATETIME arg1, STRING arg2); BIGINT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1, STRING arg2); INT DATEDIFF(DATE arg0, DATE arg1); INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)
Descrição
Os tipos de dados dos parâmetros de entrada da função DATEDIFF não correspondem. Um problema comum de incompatibilidade de tipos ocorre porque conversões implícitas de tipos de dados não são permitidas após a ativação da edição de tipos de dados MaxCompute V2.0.
Soluções
Utilize um dos seguintes métodos:
Adicione
set odps.sql.type.system.odps2=false;antes da consulta SQL e execute ambos juntos. Isso desativa o sistema de tipos de dados 2.0 e habilita a conversão implícita de tipos.Altere os tipos de dados dos parâmetros de entrada.
Mensagem de erro 9: The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole
Exemplo
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: java.lang.RuntimeException: {"RequestId":"A7BFAD2F-8982-547A-AB5E-93DAF5061FBD","HostId":"sts.aliyuncs.com","Code":"EntityNotExist.Role","Message":"The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole. ","Recommend":"https://next.api.aliyun.com/troubleshoot?q=EntityNotExist.Role&product=Sts"}
Descrição
Ao criar uma tabela externa do OSS, é necessário especificar uma função do RAM para acessar o OSS. Neste caso, foi utilizada uma função do RAM inexistente, resultando em falha na autenticação da função.
Soluções
Modifique o valor do parâmetro odps.properties.rolearn. O formato do Alibaba Cloud Resource Name (ARN) é acs:ram::<UID>:role/<Role>.
Observe as seguintes informações:
UID: um número de 16 dígitos.
Role: o nome de uma função configurada no console do Resource Access Management (RAM).
Exemplos
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'
Para obter o ARN, acesse a página Funções. Na página, clique em no nome da função para visualizar seus detalhes.
No console do RAM, na página Identity Management > Roles, localize a função AliyunPAIAccessingOSSRole na lista de funções.
Na página de detalhes da função, na seção Basic Information, encontre o campo ARN. Clique em no botão de cópia à direita para obter o valor do ARN.
Mensagem de erro 10: encounter runtime exception while evaluating function MAX_PT
Exemplo
FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null
Descrição
Durante a execução de uma instrução SQL, a partição especificada por max_pt foi alterada. Como resultado, ocorreu inconsistência de dados e o sistema retornou um erro.
Soluções
Evite executar instruções SQL nas quais max_pt esteja especificado para novas partições.
Configure o sistema para reexecutar uma tarefa de configuração caso esse erro seja reportado durante sua execução.
Mensagem de erro 11: column xxx cannot be resolved
Exemplo
ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved
Descrição
A coluna xxx não existe na tabela.
Soluções
Verifique o script SQL e atualize xxx para um nome de coluna válido.
Mensagem de erro 12: evaluate function in class XX for user defined function YY does not match annotation ZZ
Exemplo
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - evaluate function in class test.MyPlus for user defined function my_plus does not match annotation bigint->bigint
Descrição
O código da função definida pelo usuário (UDF) em Java ou Python não está em conformidade com os padrões de escrita de UDF. As informações na anotação de assinatura da função diferem daquelas presentes no código.
Soluções
Modifique o código da UDF para garantir que as informações na anotação de assinatura da função correspondam exatamente às do código.
Exemplos de instruções de consulta
-- The following is an example of an incorrect Python UDF. The implementation has two input parameters, but the annotation specifies only one.
from odps.udf import annotate
@annotate("bigint->bigint")
class MyPlus(object):
def evaluate(self, arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
-- The following is another example of an incorrect Python UDF. The evaluate function is missing the self parameter.
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
def evaluate(arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
-- The following is the correct Python UDF.
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
def evaluate(self, arg0, arg1):
if None in (arg0, arg1):
return None
return arg0 + arg1
Mensagem de erro 13: Vpc white list: , Vpc id: vpc-xxxx is not allowed to access
Exemplo
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.plan.splitting.impl.vpc.AliHyperVpcRuntimeException: Vpc white list: , Vpc id: vpc-xxxx is not allowed to access. Contact project owner to set allowed accessed vpc id list.=
Descrição
Ao acessar serviços em uma VPC por meio de uma tabela externa, essa mensagem de erro aparece devido a configurações inválidas da VPC.
Soluções
Configure uma lista de permissões de endereços IP na VPC e garanta que o MaxCompute possa acessar os serviços na VPC a partir de um endereço IP incluído na lista de permissões. Para mais informações, consulte a seção "Acesso via VPC (conexão dedicada)" em Processo de conexão de rede.
Mensagem de erro 14: Semantic analysis exception - physical plan generation failed
Exemplo
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.common.table.na.NativeException: kNotFound:The role_arn you provide not exists in HOLO auth service. Please check carefully.
Descrição
Ao acessar um service da Alibaba Cloud, a função vinculada ao service (SLR) associada a esse service não está atribuída à sua conta Alibaba Cloud. Consequentemente, não é possível acessar os dados do service utilizando a SLR.
Soluções
Clique em aqui para atribuir a SLR à sua conta Alibaba Cloud.