La función printSchema
para que sea más general. Ahora acepta cualquier DataType
y un prefijo. Si se encuentra con un StructType
, recorre sus campos y llama a printSchema
de nuevo con un nuevo prefijo. Si se encuentra con un ArrayType
, llama a printSchema
con el tipo de elemento del array y un nuevo prefijo con []
. Si no es ninguno de esos dos casos, simplemente imprime el prefijo y el tipo.
Con este enfoque, el programa puede manejar estructuras anidadas complejas, ya sean campos STRUCT
anidados dentro de otros campos STRUCT
o ARRAY
, o campos ARRAY
anidados dentro de campos STRUCT
.
Para generar un archivo CSV se puede usar la API de Spark para escribir DataFrames en formato CSV. Primero, la función printSchema
devuelve una lista de tuplas (campo, tipo)
, y luego convertimos esa lista en un DataFrame que finalmente escribimos en formato CSV.
import org.apache.spark.sql.{SparkSession, DataFrame, Row} import org.apache.spark.sql.types._ object SchemaExplorer { def main(args: Array[String]): Unit = { val spark = SparkSession.builder .appName("SchemaExplorer") .master("local[*]") .getOrCreate() val df = spark.read.json("path_a_tu_esquema_json.json") val schemaList = extractSchema(df.schema) val outputDf = spark.createDataFrame(schemaList.map(Row.fromTuple), StructType(Seq( StructField("Campo", StringType, false), StructField("Tipo", StringType, false) ))) outputDf.write.csv("path_donde_guardar.csv") spark.stop() } def extractSchema(dataType: DataType, prefix: String = ""): List[(String, String)] = { dataType match { case structType: StructType => structType.fields.flatMap { field => val newPrefix = if (prefix.isEmpty) field.name else s"$prefix.${field.name}" extractSchema(field.dataType, newPrefix) }.toList case arrayType: ArrayType => val innerType = arrayType.elementType val newPrefix = s"$prefix[]" extractSchema(innerType, newPrefix) case _ => List((prefix, dataType.simpleString)) } } }
users
que es un ARRAY de STRUCT. Cada estructura tiene campos name
y address
, donde address
es otro STRUCT con campos street
y zip
.SchemaExplorer
con este DataFrame, la salida sería:users
es un ARRAY y, por lo tanto, añade []
a su nombre. A continuación, como el tipo de elemento del ARRAY es un STRUCT, profundiza en sus campos y sigue haciendo lo mismo hasta que haya recorrido todo el esquema.
0 comentarios:
Publicar un comentario
Gracias por participar en esta página.