Usando o formato JSON no AWS Glue - AWS União

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á.

Usando o formato JSON no AWS Glue

AWS O 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 JSON, este documento apresenta os recursos disponíveis para usar seus dados no Glue. AWS

AWS O Glue suporta o uso do formato JSON. Esse formato representa estruturas de dados com forma consistente, mas com conteúdo flexível, que não são baseadas em linhas ou colunas. O JSON é definido por padrões paralelos emitidos por várias autoridades, e uma dela é a ECMA-404. Para ver uma apresentação do formato por uma fonte bastante referenciada, consulte Introducing JSON (Introdução ao JSON).

Você pode usar o AWS Glue para ler arquivos JSON do Amazon S3, bem bzip como arquivos JSON gzip compactados. 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.

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

Exemplo: ler arquivos ou pastas JSON do S3

Pré-requisitos: você precisará dos caminhos do S3 (s3path) para os arquivos ou pastas JSON que gostaria de ler.

Configuração: nas opções da sua função, especifique format="json". Em seu connection_options, use a chave paths para especificar seu s3path. Você pode alterar ainda mais a forma como sua operação de leitura atravessará o S3 nas opções de conexão. Consulte Referência de opções de conexão do Amazon S3 para obter mais detalhes. Você pode configurar como o leitor interpreta os arquivos JSON em seu format_options. Para obter mais detalhes, consulte JSON Configuration Reference (Referência de configuração de JSON).

O script AWS Glue ETL a seguir mostra o processo de leitura de arquivos ou pastas JSON do S3:

Python

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

# Example: Read JSON from S3 # For show, we handle a nested JSON file that we can limit with the JsonPath parameter # For show, we also handle a JSON where a single entry spans multiple lines # Consider whether optimizePerformance is right for your workflow. from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) spark = glueContext.spark_session dynamicFrame = glueContext.create_dynamic_frame.from_options( connection_type="s3", connection_options={"paths": ["s3://s3path"]}, format="json", format_options={ "jsonPath": "$.id", "multiline": True, # "optimizePerformance": True, -> not compatible with jsonPath, multiline } )

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

dataFrame = spark.read\ .option("multiLine", "true")\ .json("s3://s3path")
Scala

Para este exemplo, use a operação getSourceWithFormatar.

// Example: Read JSON from S3 // For show, we handle a nested JSON file that we can limit with the JsonPath parameter // For show, we also handle a JSON where a single entry spans multiple lines // Consider whether optimizePerformance is right for your workflow. import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) val dynamicFrame = glueContext.getSourceWithFormat( formatOptions=JsonOptions("""{"jsonPath": "$.id", "multiline": true, "optimizePerformance":false}"""), connectionType="s3", format="json", options=JsonOptions("""{"paths": ["s3://s3path"], "recurse": true}""") ).getDynamicFrame() } }

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

val dataFrame = spark.read .option("multiLine", "true") .json("s3://s3path")

Exemplo: gravar arquivos e pastas JSON no S3

Pré-requisitos: Você precisará de um inicializado DataFrame (dataFrame) ou (). DynamicFrame dynamicFrame Você também precisará do caminho de saída esperado do S3, s3path.

Configuração: nas opções da sua função, especifique format="json". Em seu connection_options, use a chave paths para especificar s3path. Em connection_options, você pode alterar ainda mais a forma como o gravador interage com o S3. Para obter detalhes, consulte Opções de formato de dados para entradas e saídas ETL no AWS Glue:. Referência de opções de conexão do Amazon S3 Você pode configurar como o gravador interpreta os arquivos JSON em seu format_options. Para obter mais detalhes, consulte JSON Configuration Reference (Referência de configuração de JSON).

O script AWS Glue ETL a seguir mostra o processo de gravação de arquivos ou pastas JSON a partir do S3:

Python

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

# Example: Write JSON to S3 from pyspark.context import SparkContext from awsglue.context import GlueContext sc = SparkContext.getOrCreate() glueContext = GlueContext(sc) glueContext.write_dynamic_frame.from_options( frame=dynamicFrame, connection_type="s3", connection_options={"path": "s3://s3path"}, format="json" )

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

df.write.json("s3://s3path/")
Scala

Neste exemplo, use o método getSinkWithFormat.

// Example: Write JSON to S3 import com.amazonaws.services.glue.util.JsonOptions import com.amazonaws.services.glue.{DynamicFrame, GlueContext} import org.apache.spark.SparkContext object GlueApp { def main(sysArgs: Array[String]): Unit = { val spark: SparkContext = new SparkContext() val glueContext: GlueContext = new GlueContext(spark) glueContext.getSinkWithFormat( connectionType="s3", options=JsonOptions("""{"path": "s3://s3path"}"""), format="json" ).writeDynamicFrame(dynamicFrame) } }

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

df.write.json("s3://s3path")

Referência de configuração de JSON

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

  • jsonPath— Uma JsonPathexpressão que identifica um objeto a ser lido em registros. Isso é especialmente útil quando um arquivo contém registros aninhados dentro de uma matriz externa. Por exemplo, a JsonPath expressão a seguir tem como alvo o id campo 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 usar o leitor padrão.

  • withSchema: um valor de String que especifica um esquema de tabela no formato descrito em Especificar manualmente o esquema XML. 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 Especificar manualmente o esquema XML

// 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, })

Para obter mais informações sobre o edifício a SchemaStringna biblioteca AWS Glue, consulteTipos de extensão do PySpark.

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 retornará ao 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 usar o 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.