In moderne data pipelines kom data dikwels in Hierdie formate is buigsaam, wat hiërargiese verhoudings en reeks toelaat, maar hulle kan uitdagend wees om met tradisionele relasionele benaderings te hanteer. . nested JSON or XML formats analytics, reporting, or loading into data warehouses like Snowflake In hierdie blog gaan ons oor 'n met behulp van 'n herbruikbare funksie, . dynamic, recursive approach to parsing nested JSON and XML in Spark flatten_df_recursive Real-World Scenario Stel jou voor dat jy in 'n : e-commerce company Klantdata word in JSON-lêers gestoor met geaniseerde strukture vir adresse, bestellings en betalingsinformasie. Bestel besonderhede kan reeks items bevat, elkeen met geaniseerde produk inligting. Legacy Partners stuur XML-lêers vir voorraad- en verskaffingsupdates. Your goal: Laai hierdie data in Databricks/Spark. Flatte alle ingebedde strukture dinamies (sonder hardkode kolom name). Bespaar die geflaasde uitvoer vir analise, ML of verslaglegging. Challenges: Onbekende niveaus. Slegs met gestruktureerde strukture. Dikwels verander die skedule. Dit is presies waar Kom in die hand. recursive flattening The Recursive Flatten Function Hier is die kernfunksie: from pyspark.sql.types import StructType, ArrayType from pyspark.sql.functions import col, explode_outer def flatten_df_recursive(df): """ Recursively flattens all nested StructType and ArrayType columns in a Spark DataFrame. Supports multiple nested levels for JSON/XML data. """ # Track complex fields (StructType or ArrayType) complex_fields = [(field.name, field.dataType) for field in df.schema.fields if isinstance(field.dataType, (StructType, ArrayType))] while complex_fields: col_name, col_type = complex_fields.pop(0) # If StructType, expand its fields with aliases if isinstance(col_type, StructType): expanded_cols = [ col(f"{col_name}.{nested_field.name}").alias(f"{col_name}_{nested_field.name}") for nested_field in col_type.fields ] df = df.select("*", *expanded_cols).drop(col_name) # If ArrayType, explode the array elif isinstance(col_type, ArrayType): df = df.withColumn(col_name, explode_outer(col(col_name))) # Refresh the complex fields list after modifications complex_fields = [(field.name, field.dataType) for field in df.schema.fields if isinstance(field.dataType, (StructType, ArrayType))] return df Key Features: Volledig dinamiese: Hanteer enige aantal gestreepte struk of matrasvlakke. Geen hardkodeer: Dit werk selfs as nuwe velde later bygevoeg word. Array ondersteuning: Automatiek ontploff array's na rye. XML & JSON vriendelik: Werk met enige hiërargiese data wat in Spark geladen word. Reading Nested JSON in Spark Lees die JSON-lêer met multiline df = spark.read.option("multiline", "true").json("dbfs:/FileStore/temp/orders.json") display(df) Om die JSON Data Frame in wil , maak die data gereed vir analise of verslaglegging. flatten_df_recursive flatten all nested structs and arrays flat_df = flatten_df_recursive(df) display(flat_df) Reading Nested XML in Spark xml_path = "/dbfs/data/nested_orders.xml" df = spark.read.format("xml") \ .option("rowTag", "order") \ .load(xml_path) flat_df = flatten_df_recursive(df) flat_df.show(truncate=False) "rowTag" dui op die herhalende XML-element wat 'n rekord verteenwoordig. Geïntegreerde elemente en reeks word outomaties deur "flatten_df_recursive" hanteer. Why This Approach Matters Dinamiese skema hanteer: Daar is geen behoefte om flattening logika te hanteer as JSON / XML struktuur verander nie. Ondersteun Multi-Level Nesting: Werk vir diep geaniseerde strukture en reeks. Skalbaar: Kan groot lêers op Spark verwerk sonder om alles in geheue te laai. Herbruikbaar: Werk vir enige bron — JSON, XML, Snowflake, Delta, of Parquet met gestreepte strukture. Summary Nested JSON en XML is algemeen in moderne data pipelines, maar tradisionele flattening benaderings misluk met diep nesting of skema veranderinge. Jy kan: recursive, dynamic Spark flattening function Automaat vloei enige diepte van nesting. Verwyder die strukture en strukture. Integreer met analytics, ML pipelines, en magazyne soos Snowflake. Hierdie benadering is veral nuttig vir die en Waar die data struktuur dikwels ontwikkel. ETL pipelines data lake ingestion reporting systems Hier het ek die hele verslag bygevoeg vir jou verwysing. Notebook verslag