Process unstructured data with UDF and procedure handlers¶
Este tópico fornece exemplos de leitura e processamento de dados não estruturados em arquivos preparados com código de manipulador escrito para o seguinte:
Você também pode ler um arquivo com manipuladores escritos em outras linguagens:
- Python:
- Scala:
Nota
Para tornar seu código resistente a ataques de injeção de arquivos, use sempre uma URL com escopo ao passar a localização de um arquivo para uma UDF, especialmente quando o chamador da função não for também seu proprietário. Você pode criar uma URL com escopo em SQL usando a função interna BUILD_SCOPED_FILE_URL. Para obter mais informações sobre o que o BUILD_SCOPED_FILE_URL faz, consulte Introdução aos dados não estruturados.
Como processar um PDF com uma UDF e procedimento¶
Os exemplos nesta seção processam arquivos não estruturados preparados usando o código do manipulador Java – primeiro com uma UDF, depois com um procedimento. Ambos os manipuladores extraem o conteúdo de um determinado arquivo PDF usando a bilioteca Apache PDFBox.
O código do manipulador é muito semelhante entre UDF e procedimento. Eles diferem em como lêem os dados recebidos do arquivo PDF.
Na UDF, o manipulador lê o arquivo usando um
InputStreamJava.No procedimento, o manipulador lê o arquivo usando um
SnowflakeFileSnowflake.
Os exemplos usam código manipulador em linha (ao contrário de compilado em um JAR), o que significa que você não precisa compilar, empacotar e fazer upload do código do manipulador para um estágio. Para obter mais informações sobre a diferença entre manipuladores em linha e em estágios, consulte Como manter o código do manipulador em linha ou em um estágio.
Download da biblioteca PDFBox¶
Antes de começar a escrever a UDF, faça o download do arquivo JAR da biblioteca PDFBox se você ainda não tiver feito isso. Ele será uma dependência para o código do manipulador. Posteriormente, você fará o upload do arquivo JAR da biblioteca para um estágio.
Baixe a última versão lançada da biblioteca na página de download da biblioteca Apache PDFBox.
Criação de estágios¶
Crie estágios para manter as bibliotecas de dependência do código do manipulador e o arquivo de dados que o código do manipulador lerá.
Usando o código abaixo, você criará estágios internos separados para manter:
Um arquivo JAR da biblioteca que é uma dependência para o seu manipulador. Você fará referência ao estágio e arquivo JAR da UDF.
Um arquivo de dados que seu código de manipulador irá ler.
O código no exemplo a seguir usa o comando CREATE STAGE criar os estágios necessários.
Como carregar a biblioteca necessária e o arquivo PDF a ser lido¶
Conclua as etapas a seguir para fazer upload do arquivo de dependência JAR (com o código da biblioteca que processa o PDF) e o arquivo de dados (o arquivo PDF que o código do manipulador processará).
Você pode usar o arquivo PDF de sua escolha neste exemplo.
Copie o arquivo JAR para o Apache PDFBox do diretório temporário local para o estágio que armazena os arquivos JAR:
- Linux/Mac:
- Windows:
Copie o arquivo PDF do diretório temporário local para o estágio que armazena os arquivos de dados:
- Linux/Mac:
- Windows:
Como criar e chamar a UDF¶
Conclua as etapas a seguir para criar uma UDF que lê e processa arquivos PDF.
Cole e execute o seguinte código para criar uma UDF.
Esse manipulador de UDF analisa documentos PDF e recupera seu conteúdo. O manipulador usa a classe
InputStreampara ler o arquivo. Para saber mais sobre a leitura de arquivos comInputStream, consulte Como ler um arquivo especificado dinamicamente com InputStream.Atualize a tabela de diretórios para o estágio
data_stagecom o comando ALTER STAGE:Chame a UDF para ler o arquivo PDF preparado e extraia seu conteúdo.
O código no exemplo a seguir chama a UDF, passando um URL com escopo para tornar o código resistente a ataques de injeção de arquivos. Sempre use um URL com escopo quando o chamador da função também não for seu proprietário. Você pode passar o argumento de URL como um URL com escopo ou outra forma quando o chamador da UDF é também proprietário dela.
Como criar e chamar o procedimento¶
Conclua as etapas a seguir para criar um procedimento que leia e processe arquivos PDF.
Cole e execute o seguinte código para criar um procedimento.
O manipulador deste procedimento analisa documentos PDF e recupera seu conteúdo. O manipulador usa a classe
SnowflakeFilepara ler o arquivo. Para saber mais sobre a leitura de arquivos comSnowflakeFile, consulte Como ler um arquivo especificado dinamicamente com SnowflakeFile.Atualize a tabela de diretórios para o estágio
data_stagecom o comando ALTER STAGE:Chame o procedimento para ler o arquivo PDF preparado e extraia seu conteúdo.
O código no exemplo a seguir passa um URL com escopo apontando para o arquivo PDF no estágio que você criou.
Processamento de um CSV com uma UDTF¶
O exemplo nesta seção extrai e retorna dados de arquivos preparados usando UDTFs de Java.
Como criar estágio de dados¶
Crie um estágio usando o comando CREATE STAGE:
A seguinte instrução SQL cria um estágio interno para armazenar os arquivos de dados para o exemplo:
Como carregar o arquivo CSV para leitura¶
Copie o arquivo CSV do diretório temporário local para o estágio que armazena os arquivos de dados:
- Linux/Mac:
- Windows:
Como criar e chamar a UDTF¶
Este exemplo extrai o conteúdo de um conjunto específico de arquivos CSV e retorna as linhas em uma tabela. Ao processar os dados do arquivo à medida que são lidos na origem, você pode evitar possíveis erros de falta de memória que podem surgir quando o arquivo é muito grande.
O código no exemplo do manipulador UDTF a seguir usa SnowflakeFile para gerar um InputStream de um URL de arquivo para ler um arquivo CSV. (Em um manipulador de UDTF Java, o processamento de linha começa quando Snowflake chama o método process que você implementa.) O código usa o fluxo ao construir uma instância de uma classe CsvStreamingReader definida no próprio manipulador.
A classe CsvStreamingReader lê o conteúdo do fluxo de arquivo CSV recebido linha por linha, fornecendo uma maneira para outro código recuperar cada linha como um registro onde vírgulas delimitam colunas. O método process retorna cada registro conforme ele é lido no fluxo.
Para obter mais informações sobre como escrever funções tabulares definidas pelo usuário (UDTFs) com um manipulador Java, consulte UDFs tabulares (UDTFs) de Java.
Complete os seguintes passos para criar a UDTF de Java e faça o upload dos arquivos necessários:
Crie uma UDTF de Java que usa a classe
SnowflakeFile:Atualize a tabela de diretório para o estágio
data_stage:Chame a UDTF de Java para ler um ou mais arquivos CSV preparados e extrair o conteúdo em formato de tabela:
O código no exemplo a seguir chama a UDF, passando um URL com escopo para reduzir o risco de ataques de injeção de arquivo. Sempre utilizou uma URL com escopo quando o chamador da função não é também seu proprietário. Você pode passar o argumento de URL como um URL com escopo ou outra forma suportada quando o chamador da UDF é também proprietário dela.