Uso do formato XML no AWS Glue - AWS Glue

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Uso do formato XML no AWS Glue

O AWS Glue recupera dados de fontes e grava dados em destinos armazenados e transportados em vários formatos de dados. Se seus dados forem armazenados ou transportados no formato de dados XML, este documento apresenta os recursos disponíveis para usar seus dados no AWS Glue.

O AWS Glue é compatível com o uso do formato XML. Esse formato representa estruturas de dados altamente configuráveis e rigidamente definidas que não são baseadas em linhas ou colunas. O XML é altamente padronizado. Para uma introdução ao formato pela autoridade padrão, consulte XML Essentials (Conceitos básicos de XML).

Você pode usar o AWS Glue para ler arquivos XML do Amazon S3, bem como arquivos bzip e gzip contendo arquivos XML. Você configura o comportamento de compactação no Parâmetros de conexão do S3 e não na configuração apresentada nesta página.

A tabela a seguir mostra quais são os recursos comuns do AWS Glue compatíveis com a opção de formato XML.

Leitura Escrever Leitura de transmissão Agrupar arquivos pequenos Marcadores de trabalho
Compatível Sem suporte Sem suporte Compatível Compatível

Exemplo: ler XML do S3

O leitor de XML usa um nome de tag XML. Ele examina elementos com essa tag em sua entrada para inferir um esquema e preenche um DynamicFrame com valores correspondentes. A funcionalidade de XML do AWS Glue se comporta de modo semelhante a XML Data Source for Apache Spark (Fonte de dados XML para Apache Spark). Talvez você consiga obter informações sobre o comportamento básico comparando esse leitor com a documentação do projeto.

Pré-requisitos: você precisará dos caminhos do S3 (s3path) para os arquivos ou pastas XML que deseja ler, além de algumas informações sobre seu arquivo XML. Você também precisará da tag para o elemento XML que deseja ler, xmlTag.

Configuração: nas opções da sua função, especifique format="xml". Em seu connection_options, use a chave paths para especificar s3path. Você pode configurar adicionalmente como o leitor interage com o S3 no connection_options. Para mais detalhes, consulte os tipos de conexão e opções para ETL no AWS Glue: Parâmetros de conexão do S3. Em seu format_options, use a chave rowTag para especificar xmlTag. Você pode configurar adicionalmente como o leitor interpreta os arquivos XML em seu format_options. Para obter mais detalhes, consulte XML Configuration Reference (Referência de configuração de XML).

O seguinte script de ETL do AWS Glue mostra o processo de leitura de arquivos ou pastas XML provenientes do S3.

Python

Neste exemplo, use o método create_dynamic_frame.from_options.

# Example: Read XML from S3 # Set the rowTag option to configure the reader. from awsglue.context import GlueContext from pyspark.context import SparkContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://s3path"]}, format="xml", format_options={"rowTag": "xmlTag"}, )

Você também pode usar DataFrames em um script (pyspark.sql.DataFrame).

dataFrame = spark.read\ .format("xml")\ .option("rowTag", "xmlTag")\ .load("s3://s3path")
Scala

Neste exemplo, use a operação getSourceWithFormat.

// Example: Read XML from S3 // Set the rowTag option to configure the reader. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.GlueContext import org.apache.spark.sql.SparkSession val glueContext = new GlueContext(SparkContext.getOrCreate()) val sparkSession: SparkSession = glueContext.getSparkSession object GlueApp { def main(sysArgs: Array[String]): Unit = { val dynamicFrame = glueContext.getSourceWithFormat( formatOptions=JsonOptions("""{"rowTag": "xmlTag"}"""), connectionType="s3", format="xml", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() }

Você também pode usar DataFrames em um script (org.apache.spark.sql.DataFrame).

val dataFrame = spark.read .option("rowTag", "xmlTag") .format("xml") .load("s3://s3path“)

Referência de configuração de XML

Você pode usar o seguinte format_options sempre que as bibliotecas do AWS Glue especificarem 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.

    • Tipo: texto, obrigatório

  • encoding: especifica a codificação de caracteres. Pode ser o nome ou alias de um Charset compatível com nosso ambiente de runtime. Não oferecemos garantias específicas em relação ao suporte à codificação, mas as codificações principais devem funcionar.

    • Tipo: texto, padrão: "UTF-8"

  • excludeAttribute: especifica se você deseja excluir atributos em elementos ou não.

    • Tipo: booliano, padrão: false

  • treatEmptyValuesAsNulls: especifica se o espaço em branco deve ser tratado como um valor nulo.

    • Tipo: booliano, padrão: false

  • attributePrefix: um prefixo para atributos a fim de diferenciá-los de elementos de texto secundários. Esse prefixo é usado para nomes de campo.

    • Tipo: texto, padrão: "_"

  • valueTag: a tag usada para um valor quando há atributos no elemento que não têm secundários.

    • Tipo: texto, padrão: "_VALUE"

  • ignoreSurroundingSpaces: especifica se o espaço em branco que envolve valores deve ser ignorado.

    • Tipo: booliano, padrão: false

  • withSchema: contém o esquema esperado, em situações nas quais você deseja substituir o esquema inferido. Se você não usar essa opção, o AWS Glue inferirá o esquema com base nos dados XML.

    • Tipo: texto, padrão: não aplicável

    • O valor deve ser um objeto JSON que represente um StructType.

Especificar manualmente o esquema XML

Exemplo de esquema XML manual

Este é um exemplo de uso da opção de formato withSchema para especificar o esquema para dados XML.

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 = "" )