Opções de formato para entradas e saídas de ETL em AWS Glue - AWS Glue

Opções de formato para entradas e saídas de ETL em AWS Glue

Diversos métodos e transformações Scala e PySpark do AWS Glue especificam seu formato de entrada/saída usando um parâmetro format e um parâmetro format_options. Estes parâmetros podem ter os seguintes valores.

nota

Atualmente, os únicos formatos compatíveis com trabalhos de ETL de transmissão são JSON, CSV, Parquet, ORC, Avro e Grok.

Para trabalhos que acessam tabelas governadas pelo AWS Lake Formation, o AWS Glue oferece suporte para a leitura e a escrita de todos os formatos com suporte pelas tabelas governadas pelo Lake Formation. Para obter a lista atual de formatos com suporte para tabelas governadas pelo AWS Lake Formation, consulte Notas e restrições para tabelas controladas no Guia do desenvolvedor do AWS Lake Formation.

nota

Para gravar Apache Parquet, o ETL do AWS Glue só oferece suporte para gravação em uma tabela controlada especificando uma opção para um tipo de gravador Parquet personalizado otimizado para quadros dinâmicos. Ao gravar em uma tabela governada com o formato parquet, você deve adicionar a chave useGlueParquetWriter com um valor de true nos parâmetros da tabela.

format="avro"

Esse valor designa o formato de dados Apache Avro.

Você pode usar os seguintes valores de format_options com format="avro":

  • version: especifica a versão do formato de leitor/gravador Apache Avro a ser suportada. O padrão é “1.7”. É possível especificar format_options={"version": “1.8”} para habilitar a leitura e gravação do tipo lógico Avro. Para obter mais informações, consulte a Especificação do Apache Avro 1.7.7 e a Especificação do Apache Avro 1.8.2.

    O conector do Apache Avro 1.8 oferece suporte para os seguintes tipos de conversão:

Para o leitor: esta tabela mostra a conversão entre o tipo de dados Avro (tipo lógico e o tipo primitivo Avro) e o tipo de dados DynamicFrame do AWS Glue para o leitor Avro 1.7 e 1.8.

Tipo de dados Avro:

Tipo lógico

Tipo de dados Avro:

Tipo primitivo Avro

Tipo de dados GlueDynamicFrame:

Leitor Avro 1.7

Tipo de dados GlueDynamicFrame:

Leitor Avro 1.8

Decimal bytes BINARY Decimal
Decimal fixo BINARY Decimal
Data int INT Data
Tempo (milissegundo) int INT INT
Tempo (microssegundo) longo LONG LONG
Time stamp (milissegundo) longo LONG Timestamp
Time stamp (microssegundo) longo LONG LONG
Duração (não é um tipo lógico) fixo de 12 BINARY BINARY

Para o gravador: esta tabela mostra a conversão entre o tipo de dados DynamicFrame do AWS Glue e o tipo de dados Avro para o gravador Avro 1.7 e 1.8.

Tipo de dados do DynamicFrame do AWS Glue Tipo de dados Avro:

Gravador Avro 1.7

Tipo de dados Avro:

Gravador Avro 1.8

Decimal String decimal
Data String data
Marca de data e hora String timestamp-micros

format="csv"

Esse valor designa comma-separated-values como o formato de dados. Por exemplo, consulte RFC 4180 e RFC 7111.

Você pode usar os seguintes valores de format_options com format="csv":

  • separator: especifica o caractere delimitador. O padrão é uma vírgula: ",", mas qualquer outro caractere pode ser especificado.

  • escaper: especifica um caractere a ser usado para escape. Essa opção é usada somente ao ler arquivos CSV. O valor padrão é none. Se ativado, o caractere que imediatamente segue é usado no estado em que se encontram, exceto para um pequeno conjunto de escapes conhecidos (\n, \r, \t e \0).

  • quoteChar: especifica o caractere a ser usado para aspas. O padrão é aspas duplas: '"'. Defina como -1 para desativar as aspas por completo.

  • multiLine: um valor booliano que especifica se um único registro pode gerar várias linhas. Isso pode ocorrer quando um campo contém um caractere de nova linha entre aspas. Você deve definir essa opção como True se algum registro ocupar várias linhas. O valor padrão é False, que permite uma divisão de arquivos mais radical durante a análise.

  • withHeader: um valor booliano que especifica se deve tratar a primeira linha como um cabeçalho. O valor padrão é False. Esta opção pode ser usada na classe DynamicFrameReader.

  • writeHeader: um valor booliano que especifica se deve gravar o cabeçalho na saída. O valor padrão é True. Esta opção pode ser usada na classe DynamicFrameWriter.

  • skipFirst: um valor booliano que especifica se deve ignorar a primeira linha de dados. O valor padrão é False.

  • optimizePerformance: um valor booleano que especifica se deve usar o leitor SIMD para CSV avançado junto com formatos de memória colunar baseados em Apache Arrow. Disponível apenas no AWS Glue 3.0.

O exemplo a seguir mostra como especificar as opções de formato dentro de um script de trabalho de ETL do AWS Glue.

glueContext.write_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = { "path": "s3://s3path" }, format = "csv", format_options={ "quoteChar": -1, "separator": "|" }, transformation_ctx = "datasink2")

Usar o leitor vetorizado SIMD para CSV com formato colunar Apache Arrow

O AWS Glue versão 3.0 adiciona suporte para o uso do Apache Arrow como o formato colunar na memória, que permite criar lotes de registros juntos em formato colunar. Os lotes reduzem os gargalos da CPU relacionados ao manuseio do esquema de alteração em lotes de registros e aumentam a eficiência de recuperação de dados de buffers de coluna. O AWS Glue vetoriza os leitores CSV com o uso de conjuntos de instruções SIMD da CPU e algoritmos microparalelos. Com essas otimizações, o AWS Glue versão 3.0 alcança uma velocidade de performance significativa em comparação ao uso de DynamicFrame ou Spark DataFrames baseados em linhas do AWS Glue.

Para usar o leitor otimizado com o formato Arrow, defina “optimizePerformance” (otimizar performance) como true em format_options ou na propriedade da tabela.

glueContext.create_dynamic_frame.from_options( frame = datasource1, connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "csv", format_options={ "optimizePerformance": True, "separator": "," }, transformation_ctx = "datasink2")

Limitações para o leitor vetorizado de CSV

Observe as seguintes limitações:

  • Ele não oferece suporte às opções de formato multiLine e escaper. Ele usa o escaper padrão de caractere de aspas duplas '"'. Quando essas opções são definidas, o AWS Glue automaticamente volta ao uso do leitor de CSV baseado em linha.

  • Ele não oferece suporte à criação de um DynamicFrame com ChoiceType.

  • Ele não oferece suporte à criação de um DynamicFrame com registros de erro.

  • Ele não oferece suporte à leitura de arquivos CSV com caracteres multiByte, como caracteres japoneses ou chineses.

format="ion"

Esse valor designa Amazon Ion como o formato de dados. (Para obter mais informações, consulte a Especificação do Amazon Ion.)

No momento, o AWS Glue não é compatível com o ion para saída.

Não há valores de format_options para format="ion".

format="grokLog"

Esse valor designa um formato de dados de log especificado por um ou mais padrões Logstash do Grok (por exemplo, consulte Referência do Logstash (6.2): plugin do filtro Grok).

No momento, o AWS Glue não é compatível com o groklog para saída.

Você pode usar os seguintes valores de format_options com format="grokLog":

  • logFormat: especifica o padrão Grok que corresponde ao formato de log.

  • customPatterns: especifica outros padrões Grok usados aqui.

  • MISSING: especifica o sinal a ser usado na identificação de valores ausentes. O padrão é '-'.

  • LineCount: especifica o número de linhas em cada registro de log. O padrão é '1', e atualmente somente os registros de linha única são compatíveis.

  • StrictMode: um valor booliano que especifica se o modo estrito está habilitado. No modo estrito, o leitor não faz conversão ou recuperação de tipo automática. O valor padrão é "false".

format="json"

Esse valor designa um formato de dados JSON (JavaScript Object Notation).

Você pode usar os seguintes valores de format_options com format="json":

  • jsonPath: uma expressão JsonPath que identifica um objeto a ser ler lido em registros. Isso é especialmente útil quando um arquivo contém registros aninhados dentro de uma matriz externa. Por exemplo, a expressão JsonPath a seguir visa o campo id de um objeto JSON.

    format="json", format_options={"jsonPath": "$.id"}
  • multiLine: um valor booliano que especifica se um único registro pode gerar várias linhas. Isso pode ocorrer quando um campo contém um caractere de nova linha entre aspas. Você deve definir essa opção como "true" se algum registro ocupar várias linhas. O valor padrão é "false", que permite uma divisão de arquivos mais radical durante a análise.

  • optimizePerformance: um valor booleano que especifica se deve usar o leitor SIMD para JSON avançado junto com formatos de memória colunar baseados em Apache Arrow. Disponível apenas no AWS Glue 3.0. Não compatível com multiLine ou jsonPath. Fornecer qualquer uma dessas opções instruirá o AWS Glue a voltar ao leitor padrão.

  • withSchema: um valor de String que especifica um esquema de tabela no formato descrito em Com o esquema do exemplo. Usado apenas com o optimizePerformance ao ler de conexões que não são do catálogo.

Usar o leitor vetorizado SIMD para JSON com formato colunar Apache Arrow

O AWS Glue versão 3.0 adiciona um leitor vetorizado para dados JSON. Ele executa duas vezes mais rápido sob certas condições, em comparação com o leitor padrão. Esse leitor vem com certas limitações que os usuários devem conhecer antes de usar, documentadas nesta seção.

Para usar o leitor otimizado, defina "optimizePerformance" como Verdadeiro no format_options ou propriedade de tabela. Você também precisará fornecer withSchema a menos que esteja lendo do catálogo. O withSchema espera uma entrada conforme descrito em Com o esquema do exemplo

// Read from S3 data source glueContext.create_dynamic_frame.from_options( connection_type = "s3", connection_options = {"paths": ["s3://s3path"]}, format = "json", format_options={ "optimizePerformance": True, "withSchema": SchemaString }) // Read from catalog table glueContext.create_dynamic_frame.from_catalog( database = database, table_name = table, additional_options = { // The vectorized reader for JSON can read your schema from a catalog table property. "optimizePerformance": True, })

Limitações para o leitor vetorizado de CSV

Observe as seguintes limitações:

  • Elementos JSON com objetos aninhados ou valores de matriz não são compatíveis. Se fornecido, o AWS Glue voltará para o leitor padrão.

  • Um esquema deve ser fornecido do Catálogo ou com withSchema.

  • Não compatível com multiLine ou jsonPath. Fornecer qualquer uma dessas opções instruirá o AWS Glue a voltar ao leitor padrão.

  • Fornecer registros de entrada que não correspondam ao esquema de entrada resultará em falha do leitor.

  • Registros de erro não serão criados.

  • Arquivos JSON com caracteres multiByte, como caracteres japoneses ou chineses, não são aceitos.

format="orc"

Esse valor designa Apache ORC como o formato de dados. (Para obter mais informações, consulte LanguageManual ORC.)

Não há valores de format_options para format="orc". No entanto, quaisquer opções aceitas pelo código SparkSQL subjacente podem ser transmitidas para ele por meio do parâmetro de mapa connection_options.

format="parquet"

Esse valor designa o Apache Parquet como o formato de dados, mas também fornece uma opção para uso de um tipo de gravador Parquet personalizado que é otimizado para quadros dinâmicos. Um esquema pré-calculado não é necessário antes da gravação. Quando especificado pela opção useGlueParquetWriter, o gravador computa e modifica o esquema dinamicamente, conforme os dados chegam.

Você pode usar os seguintes valores de format_options:

  • useGlueParquetWriter: especifica o uso de um tipo de gravador Parquet personalizado otimizado para quadros dinâmicos. O formato da saída é Parquet.

Veja o exemplo a seguir, onde sink é o objeto retornado por glue_context.getSink().

sink.setFormat("parquet", useGlueParquetWriter=True)

Limitações ao especificar useGlueParquetWriter:

  • O gravador oferece suporte apenas à evolução do esquema, como adicionar ou remover colunas, mas não a alterar tipos de coluna, como com ResolveChoice.

  • O gravador não é capaz de armazenar um arquivo somente de esquema.

  • A opção só pode ser passada como um formato para destinos de dados.

E ainda, quaisquer opções aceitas pelo código SparkSQL subjacente podem ser transmitidas para ele por meio do parâmetro de mapa connection_options. Por exemplo, uma configuração do Spark, como mergeSchema pode ser definida para o leitor do Spark do AWS Glue para mesclar o esquema para todos os arquivos.

  • compression: especifica o codec de compactação usado ao gravar arquivos Parquet. O codec de compactação usado com o formato glueparquet é totalmente compatível com o org.apache.parquet.hadoop.metadata.CompressionCodecName *, que inclui suporte para "uncompressed", "snappy", "gzip" e "lzo". O valor padrão é "snappy".

  • blockSize: especifica o tamanho em bytes de um grupo de linhas que estão sendo armazenadas em buffer na memória em megabytes. O valor padrão é 134217728, ou 128 MB.

  • pageSize: especifica o tamanho em bytes da menor unidade que deve ser lida totalmente para acessar um único registro. O valor padrão é 1048576, ou 1 MB.

format="xml"

Esse valor designa XML como o formato de dados, analisado por meio de uma bifurcação do analisador Fonte de dados XML para Apache Spark.

No momento, o AWS Glue não é compatível com "xml" para saída.

Você pode usar os seguintes valores de format_options com format="xml":

  • rowTag: especifica a tag XML no arquivo a ser tratada como uma linha. Tags de linha não podem ser de fechamento automático.

  • encoding: especifica a codificação de caracteres. O valor padrão é "UTF-8".

  • excludeAttribute: um valor booliano que especifica se você deseja excluir atributos em elementos ou não. O valor padrão é "false".

  • treatEmptyValuesAsNulls: um valor booliano que especifica se o espaço em branco deve ser tratado como um valor nulo. O valor padrão é "false".

  • attributePrefix: um prefixo para atributos, para diferenciá-los dos elementos. Esse prefixo é usado para nomes de campo. O valor padrão é "_".

  • valueTag: a tag usada para um valor quando há atributos no elemento que não têm filho. O padrão é "_VALUE".

  • ignoreSurroundingSpaces: um valor booliano que especifica se o espaço em branco que envolve valores deve ser ignorado. O valor padrão é "false".

  • withSchema: um valor de string que contém o esquema esperado. Se você não usar essa opção, o AWS Glue infere o esquema dos dados XML.

Com o esquema do exemplo

Este é um exemplo de uso da opção de formato withSchema para especificar o esquema para dados XML. Fazemos uso de tipos do AWS Glue, consulte Tipos de extensão do PySpark.

from awsglue.gluetypes import * schema = StructType([ Field("id", IntegerType()), Field("name", StringType()), Field("nested", StructType([ Field("x", IntegerType()), Field("y", StringType()), Field("z", ChoiceType([IntegerType(), StringType()])) ])) ]) datasource0 = create_dynamic_frame_from_options( connection_type, connection_options={"paths": ["s3://xml_bucket/someprefix"]}, format="xml", format_options={"withSchema": json.dumps(schema.jsonValue())}, transformation_ctx = "" )