A função GET_BLOB_FROM_OSS processa dados não estruturados em uma tabela de objetos do MaxCompute. Ela gera um valor blob que referencia todo ou parte de um objeto no Object Storage Service (OSS) com base na chave do objeto.
Casos de uso
Esta função é ideal para carregar objetos grandes sob demanda, como imagens, áudio, vídeo, PDFs e entradas de modelos, ou para ingerir dados em tabelas blob.
Diferentemente da GET_DATA_FROM_OSS, a GET_BLOB_FROM_OSS não baixa imediatamente o binary content para a expressão atual. Em vez disso, retorna uma referência blob com informações como local de armazenamento, intervalo de bytes e tipo de conteúdo opcional.
Execute as seguintes operações:
Use READ BLOB para ler o conteúdo do
blobsob demanda.Grave o
blobem uma tabela de destino compatível com o tipo de dadoblobpara leitura e processamento posteriores. Para mais informações, consulte Blob data type and multi-modal storage.Utilize a função GET_BLOB_METADATA para visualizar
metadata, como comprimento do conteúdo, tipo de conteúdo e tipo de armazenamento.Empregue a pseudocoluna
_blobde umaobject tablecomo forma abreviada da chamada básica da função.
Limitações
O MaxCompute deve usar o
data type 2.0. Para mais informações, consulte Data type editions.Ative o recurso de
schemano seuprojectdo MaxCompute. Para mais informações, consulte Enable the schema property.O
MaxQAnão oferece suporte a esta função. Se você executar esta função em umSQL nodedo DataWorks, adicione a instruçãoSET odps.mcqa.disable=true;e execute-a junto com sua instrução SQL.
Diferenças em relação a funções relacionadas
|
Função |
Tipo de retorno |
Retorna o conteúdo do objeto diretamente |
Casos de uso típicos |
|
BINARY |
Sim |
Analisar ou transformar imediatamente o conteúdo de objetos menores em SQL. |
|
|
GET_BLOB_FROM_OSS |
blob |
Não; retorna uma referência |
Carregamento sob demanda, passagem para funções compatíveis com |
|
STRING |
Não; retorna uma |
Permite que um cliente HTTP fora do MaxCompute baixe ou faça upload de um objeto. |
Sintaxe
blob GET_BLOB_FROM_OSS(
STRING <full_object_table_name>,
STRING <key>
[, BIGINT <offset>]
[, BIGINT <length>]
[, STRING <object_not_found_policy>]
)
Para especificar o length, defina primeiro o offset.
As seguintes combinações de parâmetros são suportadas:
GET_BLOB_FROM_OSS(table_name, key)
GET_BLOB_FROM_OSS(table_name, key, object_not_found_policy)
GET_BLOB_FROM_OSS(table_name, key, offset, length)
GET_BLOB_FROM_OSS(table_name, key, offset, length, object_not_found_policy)
Parâmetros
Parâmetro | Obrigatório | Tipo de dado | Valor padrão | Descrição |
full_object_table_name | Sim | STRING | Nenhum | Caminho completo da object table. Se o recurso Se você usou RoleARN para autenticação ao criar a tabela, este parâmetro ajuda a gerar automaticamente um |
key | Sim | STRING | Nenhum | Nome do objeto a ser acessado na |
offset | Não | BIGINT | 0 | Posição inicial em bytes para leitura do conteúdo do objeto. O valor deve ser maior ou igual a 0. |
length | Não | BIGINT | -1 | Número de bytes a serem lidos. |
object_not_found_policy | Não | STRING | OUTPUT_NULL | Define o comportamento da função quando uma chave de objeto existe nos
|
Valor de retorno
Retorna um valor blob.
Um blob registra uma referência ao local de armazenamento do objeto no OSS, seu intervalo válido de bytes e seu tamanho, mas não contém o conteúdo completo do objeto. Portanto, não use STRING(GET_BLOB_FROM_OSS(...)) para ler conteúdo de texto. Chame primeiro READ_BLOB para obter um valor BINARY e depois converta-o em string. Exemplo:
SET odps.namespace.schema=true;
SELECT CAST(
READ_BLOB(
GET_BLOB_FROM_OSS(
'<project_name>.<schema_name>.ot_demo',
key
)
) AS STRING
) AS object_text
FROM ot_demo
WHERE key = 'example.txt';
Exemplos
Uma object table armazena em cache apenas os metadata dos objetos do OSS e não copia o conteúdo do objeto. Se um objeto do OSS for adicionado, excluído ou alterado, atualize os metadata conforme a política de atualização da tabela. Caso contrário, uma chave pode permanecer no cache para um objeto inexistente no OSS.
Preparar os dados
Dados TXT
Faça upload dos seguintes dados TXT para o OSS: test_travel.zip.
-
Crie uma
object table.SET odps.namespace.schema=true; CREATE OBJECT TABLE IF NOT EXISTS txt_demo WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole') LOCATION 'oss://oss-<region>-internal.aliyuncs.com/<oss_path>/'; -
Leia a
object table.ALTER TABLE txt_demo REFRESH METADATA; SET odps.namespace.schema=true; SELECT COUNT(*) AS ROW_COUNT FROM txt_demo; -- The following result is returned: +------------+ | row_count | +------------+ | 20 | +------------+
Dados PDF
Faça upload dos seguintes dados PDF para o OSS: pdf_demo.zip.
-
Crie uma
object table.SET odps.namespace.schema=true; CREATE OBJECT TABLE IF NOT EXISTS pdf_demo WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole') LOCATION 'oss://oss-<region>-internal.aliyuncs.com/<oss_path>/'; -
Leia a
object table.-- Refresh the table to cache the object metadata in MaxCompute. ALTER TABLE pdf_demo REFRESH METADATA; SET odps.namespace.schema=true; SELECT COUNT(*) AS ROW_COUNT FROM pdf_demo; -- The following result is returned: +------------+ | row_count | +------------+ | 10 | +------------+
Etapa 1: Gerar um blob para cada objeto do OSS
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT
key,
GET_BLOB_FROM_OSS(
'<project>.<schema>.txt_demo',
key
) AS object_blob
FROM txt_demo limit 1;
-- This is equivalent to the following syntax:
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT
key,
GET_BLOB_FROM_OSS(
'<project>.<schema>.txt_demo',
key,
0,
-1,
'OUTPUT_NULL'
) AS object_blob
FROM txt_demo limit 1;
-- The following result is returned:
+------+-------------+
| key | object_blob |
+------+-------------+
| test_travel01.txt | CAEQAxrgAgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAWAEAAFgBAABYAQAAWAEAAFgBAABgAQAAYAEAAGABAABgAQAADwEAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOQAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA0L0FkaG9jU2luay8yMDI2MDgwNDA5MTcyMzg4NWdqZXZsNmtoNXplNS9jb25zb2xlX3F1ZXJ5X3Rhc2tfMTc4NTgzNTA0MzQxNjBfMC8xLy1leHQtLzIwMjYwODA0MDkxNzIzODg1Z2pldmw2a2g1emU1X00xXzBfMF8wMDAwMDBfY2lkMS5ibG9iAQAAAAAAAAAiACoUsPTTV9LIq38UBOcOFkMuEmqWFngyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HTIwMjYwODA0MDkxNzIzODg1Z2pldmw2a2g1emU1 |
+------+-------------+
Etapa 2: Usar a pseudocoluna _blob como abreviação
A _blob não é uma coluna real de metadados da tabela de objetos; portanto, SELECT * não a inclui automaticamente. Referencie-a explicitamente. Para definir offset, length, política de ausência ou tipo de conteúdo, use a chamada completa da função.
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT key, _blob FROM txt_demo limit 1;
-- This is equivalent to the following syntax:
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT
key,
GET_BLOB_FROM_OSS(
'<project>.<schema>.txt_demo',
key
) AS `_blob`
FROM txt_demo limit 1;
-- The following result is returned:
+------+-------+
| key | _blob |
+------+-------+
| test_travel01.txt | CAEQAxreAgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAABeAQAADwEAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA0L0FkaG9jU2luay8yMDI2MDgwNDA5MzAyNzk2NWc4M2FpamkyNjVuL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODM1ODI3NDA1MF8wLzEvLWV4dC0vMjAyNjA4MDQwOTMwMjc5NjVnODNhaWppMjY1bl9NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAAIgAqFA2jSV9PtAiPH3AM0+59uTImxTmQMhkKCW5zLWRpcmVjdBIMeXl5X3Rlc3RfZGV2OhwyMDI2MDgwNDA5MzAyNzk2NWc4M2FpamkyNjVu |
+------+-------+
Etapa 3: Ler uma parte do conteúdo do objeto
-
O exemplo a seguir referencia até 64 bytes a partir do byte 0 de cada objeto.
-- Enable data type 2.0. SET odps.sql.type.system.odps2=true; -- Enable three-level syntax for project.schema.table. SET odps.namespace.schema=true; -- If you run this from a DataWorks SQL node, add the following line to disable MaxQA. SET odps.mcqa.disable=true; SELECT key, read_blob( GET_BLOB_FROM_OSS( '<project>.<schema>.txt_demo', key, 0, 64 ))AS object_segment FROM txt_demo limit 1; -- The following result is returned: +------+----------------+ | key | object_segment | +------+----------------+ | test_travel01.txt | =E5=8C=97=E4=BA=AC=C2=B7=E6=95=85=E5=AE=AB=EF=BC=88=E5=8E=86=E5=8F=B2=E5=8F=A4=E8=BF=B9=EF=BC=89=EF=BC=9A=E7=BA=A2=E5=A2=99=E9=BB=84=E7=93=A6=E9=97=B4=E6=B5=81=E6=B7=8C=E7=9D=80=E5=85=AD=E7=99 | +------+----------------+ -
Ao ler este
blob, a funçãoread_blobopera dentro do intervalo de bytes especificado. Também é possível extrair um subsegmento desteblob.SET odps.sql.type.system.odps2=true; -- Enable three-level syntax for project.schema.table. SET odps.namespace.schema=true; -- If you run this from a DataWorks SQL node, add the following line to disable MaxQA. SET odps.mcqa.disable=true; SELECT read_blob( GET_BLOB_FROM_OSS( '<project>.<schema>.txt_demo', key, 0, 64 ), 0, 32 ) AS first_32_bytes_of_segment FROM txt_demo limit 1; -- The following result is returned: +---------------------------+ | first_32_bytes_of_segment | +---------------------------+ | =E5=8C=97=E4=BA=AC=C2=B7=E6=95=85=E5=AE=AB=EF=BC=88=E5=8E=86=E5=8F=B2=E5=8F=A4=E8=BF=B9=EF=BC=89 | +---------------------------+
Etapa 4: Definir o tipo de conteúdo e visualizar os metadados do blob
O objeto JSON retornado pela função GET_BLOB_METADATA contém campos como content_type, content_length, storage_type, checksum, and content_encoding.
Para valores gerados por GET_BLOB_FROM_OSS, o storage_type é OSS. Se você não passar explicitamente um content_type, o campo content_type nos metadata será NULL.
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT GET_BLOB_METADATA(
GET_BLOB_FROM_OSS(
'<project>.<schema>.pdf_demo',
key,
'THROW_EXCEPTION',
'application/pdf'
)
) AS blob_metadata
FROM pdf_demo
WHERE key LIKE '%.pdf' limit 1;
-- The following result is returned:
+---------------+
| blob_metadata |
+---------------+
| {"checksum":null,"content_type":"application/pdf","storage_type":"OSS","is_compressed":false,"content_length":261567,"content_encoding":null,"blob_storage_tier":"STANDARD"} |
+---------------+
Etapa 5: Gravar em uma tabela blob
-
Para armazenar resultados para uso a longo prazo ou reutilização em tarefas subsequentes, grave-os em uma tabela compatível com o tipo de dado
blob. Para mais informações, consulte Blob data type and multi-modal storage.-- Enable data type 2.0. SET odps.sql.type.system.odps2=true; -- Enable three-level syntax for project.schema.table. SET odps.namespace.schema=true; -- If you run this from a DataWorks SQL node, add the following line to disable MaxQA. SET odps.mcqa.disable=true; CREATE TABLE IF NOT EXISTS object_blob_sink ( object_key STRING, object_data blob ) TBLPROPERTIES ( 'table.format.version' = '2', 'transactional' = 'true' ); INSERT INTO object_blob_sink SELECT key, GET_BLOB_FROM_OSS( '<project>.<schema>.txt_demo', key, 'THROW_EXCEPTION' ) FROM txt_demo; -
Após a gravação, use
read_blobpara ler o conteúdo.-- Enable data type 2.0. SET odps.sql.type.system.odps2=true; SELECT object_key, CAST(READ_BLOB(object_data) AS STRING) AS object_text FROM object_blob_sink WHERE object_key = 'test_travel01.txt'; -- The following result is returned: +------------+-------------+ | object_key | object_text | +------------+-------------+ | test_travel01.txt | Beijing · Forbidden City (Historical Site): Within the red walls and yellow tiles flows the imperial majesty of six hundred years. Walking among the golden ginkgo trees in autumn is the best way to feel the profound history and serene beauty of the Forbidden City. | +------------+-------------+
Etapa 6: Processar apenas objetos filtrados
Filtre primeiro as consultas da object table com base nos metadata e gere valores blob apenas para os objetos correspondentes.
Por exemplo, para processar apenas arquivos TXT com tamanho menor ou igual a 170 bytes, filtre primeiro os metadata da object table. Isso reduz o número de consultas de status do OSS e leituras de conteúdo subsequentes.
-- Enable data type 2.0.
SET odps.sql.type.system.odps2=true;
-- Enable three-level syntax for project.schema.table.
SET odps.namespace.schema=true;
-- If you run this from a DataWorks SQL node, add the following line to disable MaxQA.
SET odps.mcqa.disable=true;
SELECT
key,
GET_BLOB_FROM_OSS(
'<project>.<schema>.txt_demo',
key,
'WARN_AND_NULL',
'application/txt'
) AS document_blob
FROM txt_demo
WHERE key LIKE '%.txt'
AND size <= 170;
-- The following result is returned, showing that the data has been filtered:
+------+---------------+
| key | document_blob |
+------+---------------+
| test_travel01.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAApAAAAAAAAAAAAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUqGGDqqv2cyDwow86F8uQa+wWHdQyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel02.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAoQAAAAAAAACkAAAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUUhmRcOOiCCBQ0LXOdBulUociULYyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel04.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAoQAAAAAAAABFAQAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoU69Ba157khgFI/9FvtdoawcOw4UkyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel08.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAAqQAAAAAAAADmAQAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUEb5KuihKijpGxK0QjStIO4xvGuYyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
| test_travel11.txt | CAEQAxr1AgEAAAANAAAAAAAAAAEAAAAAAAAADQAAAAAAAABYAAAAXAAAAGQAAABsAAAAVgEAAFYBAABWAQAAVgEAAFYBAABeAQAAXgEAAF4BAAB1AQAADwkAAAAAAAAAAAAApwAAAAAAAACPAgAAAAAAAOIAAAAAAAAAcGFuZ3U6Ly9PRFBTLUNOLUJFSUpJTkctSDoxMDI0MC9wcm9kdWN0L2FsaXl1bi9vZHBzL3l5eV90ZXN0X2Rldi8uRnV4aUpvYlRlbXBSb290LzIwMjYwODA1L0FkaG9jU2luay8yMDI2MDgwNTAyNTIzNjEyMGc3bDd3NzQxa2pnL2NvbnNvbGVfcXVlcnlfdGFza18xNzg1ODk4MzU1NzI5MF8wLzEvLWV4dC0vMjAyNjA4MDUwMjUyMzYxMjBnN2w3dzc0MWtqZ19NMV8wXzBfMDAwMDAwX2NpZDEuYmxvYgEAAAAAAAAADwAAAAAAAABhcHBsaWNhdGlvbi90eHQiACoUuVU6K/SEmU1aRdxjLSRgXhx0j1MyGQoJbnMtZGlyZWN0Egx5eXlfdGVzdF9kZXY6HDIwMjYwODA1MDI1MjM2MTIwZzdsN3c3NDFramc= |
+------+---------------+
Recomendações de desempenho
Dividir tarefas por tamanho do objeto
A GET_BLOB_FROM_OSS pode acionar a divisão de task com base no tamanho do objeto. Isso evita problemas de long tail causados pela concentração de arquivos grandes em poucos workers quando a divisão considera apenas o número de linhas de metadata.
Ao usar a divisão por tamanho, ajuste a unidade de divisão conforme a distribuição do tamanho dos objetos e o tempo de processamento por objeto:
-- The priority is KB > MB > GB. Tune based on object size distribution and per-object processing time. Do not set the unit too small just to increase parallelism.
-- Default unit configuration in GiB.
SET odps.sql.object.table.split.unit.gb=1;
-- MB configuration takes precedence over the GB configuration.
SET odps.sql.object.table.split.unit.mb=512;
-- KB configuration has the highest priority.
SET odps.sql.object.table.split.unit.kb=512;
-- To disable splitting by object size, set the following parameter. Disabling this may create additional preprocessing jobs. The actual execution plan depends on the output in Logview.
SET odps.sql.object.table.split.by.object.size.enabled=false;
Evitar a leitura não intencional de objetos grandes inteiros
Se um processo downstream precisar apenas do cabeçalho do arquivo, magic number ou de um pequeno intervalo de conteúdo, defina
offsetelength.Para filtrar objetos, priorize as colunas de metadados da tabela de objetos, como
key,size,typeelast_modified.A
GET_BLOB_FROM_OSSgera principalmente uma referência, masread_blobe a gravação em uma tabela BLOB podem acionar uma leitura real do objeto. Avalie o custo com base no tráfego real do OSS e nos recursos de computação.Se muitos objetos retornarem
WARN_AND_NULL, atualize os metadados da Object Table ou verifique o ciclo de vida dos dados no OSS em vez de depender de avisos por objeto a longo prazo.
Perguntas frequentes
Por que o primeiro parâmetro deve usar o nome completo da tabela?
Este parâmetro identifica a Object Table e recupera a configuração de acesso ao OSS da tabela no contexto da tarefa. Recomendamos sempre usar o nome completo em três partes project.schema.object_table e garantir que ele corresponda à Object Table realmente verificada na cláusula FROM.
Por que a função retorna NULL mesmo se o objeto existir na tabela de objetos?
As consultas da Object Table usam metadados em cache. Se um objeto for excluído após a atualização mais recente dos metadados, a política padrão OUTPUT_NULL retorna NULL. Atualize os metadados ou use temporariamente WARN_AND_NULL ou THROW_EXCEPTION para localizar os dados inconsistentes.
A GET_BLOB_FROM_OSS faz download do objeto?
Não. A função acessa o OSS para obter o status e o tamanho do objeto, mas retorna uma referência blob. Os bytes do objeto são lidos somente quando você chama read_blob, passa o blob para uma função que lê seu conteúdo ou o grava em uma tabela de destino que materializa o conteúdo.
Um blob pode ser usado como coluna de partição ou chave primária?
Não. A validação de tipo impede o uso de blob como partition column ou primary key. Um blob também não pode ser aninhado em complex types como ARRAY, MAP ou STRUCT. Use blob como uma coluna de dados comum.
Devo usar GET_BLOB_FROM_OSS ou uma URL assinada?
Com
GET_BLOB_FROM_OSS, o processamento subsequente permanece nos sistemas SQL e BLOB do MaxCompute.Para recuperar imediatamente o conteúdo binário de um objeto, use
GET_DATA_FROM_OSS.Para permitir que ECS, serviços de terceiros ou clientes HTTP acessem diretamente o OSS, use
GET_SIGNED_URL_FROM_OSS. Uma URL assinada tem tempo de expiração e depende da configuração de Acesso Público do Bucket e da acessibilidade do endpoint de rede.
Erro ao consultar detalhes do blob
-
Detalhes do erro
{"serverCostTime":191,"requestId":"068ebe0f2ed96a2aab0998e0770f40ec", "success":false,"errCode":"CP001", "errMsg":"Current access is abnormal, please start from the data analysis homepage."} -
Causa raiz
Por padrão, os
SQL nodesno DataWorks usamMaxQApara execução. -
Solução
Ao consultar uma
object tableem umSQL nodedo DataWorks, incluaSET odps.mcqa.disable=true;.