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.