áá±áž áá¬á! áá±á¬ááºážáá«ážáá²á· áá¬áá¬ááŒááºáá»ááºááᯠáááºážáá²á·á¡á¬áá¯á¶ááᯠáá«áááºááŒáááºá
áá»áœááºá¯ááºááá¯á·á á¡ááœá±á·á¡ááŒá¯á¶áá²á·ááá¯á· áá±áá¬ááẠá¡áááºáááŒáẠá á¯áá±á¬ááºážáá±ááŒá®áž ááá¯ážáááºáá±áá«áááºá ááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºá á±áááºá áá»áœááºá¯ááºááá¯á·áááá¹áá¬áá áááºááá¯ááºážááá¯ááºáá¬áá¯á¶á á¶áá»á¬ážááẠááááºážááááºážá¡áá áºáá»á¬ážâááááºááá»áœááºá¯ááºááá¯á·ááááá²á·áá±á¬á¡áá¬áá»á¬ážááá¯ááŒáá·áºááŸá¯áááºáááºážáááºážá¡áá áºáá»á¬ážáá«ááŸááá±á¬ á¡ááá¯ááºážá¡áá¬á¡áá áºá¡áá»áá¯á·áá«ááŸááá±á¬ áá±áá¬á¡áá áºáá»á¬ážááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŸáááá«áááºá á€á áááºááá¯ááºážááá¯ááºáᬠáá±á¬áºáááºáá»á¬ážááẠá¡áá»ááºá¡áááºá¡áá áºáá»á¬ážááᯠá¡áá»áá¯ážá¡á á¬ážááœá²áá¯á¶ááŸáá·áº á á®áá¶áá±á¬ááºááœááºáá¯á¶ááᯠáá¯á¶ážááŒááºááá·áº ááá¬ážááá¬ážáá»á¬ážááŸáá·áº áá»á¬ážá áœá¬ááœá¬ááŒá¬ážááŸá¯áááŸááá«á
áááºážááẠschema á á®áá¶ááá·áºááœá²ááŸá¯ááá¯ááºáá¬ááŒá¿áá¬ááá¯áá»áœááºá¯ááºááá¯á·áá¶áá±á¬ááºá á±áááºá áá¯ááºáááºážá áááºáá±á«áºááŸá¯áá»á¬ážááŸáá·áº ááá¯á¡ááºáá»ááºáá»á¬ážááẠá¡áá»áááºááŸáá·áºá¡áá»áŸ ááŒá±á¬ááºážáá²áá¬áááºááŸáá·áºá¡áá»áŸ ááá·áºáá±áá¬áááœá²á·á ááºážáá¯á¶áááºáááºáž á¡áá¬ážáá°áááºááŒá áºáááºá áá±áá¬ááŒá±á¬ááºážáá²ááŸá¯ááŒá±á¬áá·áº Delta Lake ááẠááá¯ááºážáá¬ááŸá¯á¡áá áºáá»á¬ážááᯠááááºáááºááẠááœááºáá°á á±áááºá á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠáááºážááá¯á·á table schemas ááᯠá á®áá¶ááá·áºááœá²ááẠááá¯ážááŸááºážáá±á¬ áá±á«áá¬ááá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºááŸááááºá á€áááááá¬áá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠá¡ááŸá¬ážá¡ááœááºážáá»á¬áž ááá¯á·ááá¯áẠáááá¯á¡ááºáá±á¬áá±áá¬áá»á¬ážááŒáá·áº áááºážááá¯á·áááá¬ážáá»á¬ážááᯠááááºááœááºáá² áá áºáááºážá á±ááŒááºážá០áá¬ááœááºáá±ážááá·áº Schema Enforcement ááŸáá·áº Schema Evolution á áááºááá¯ážááŸááá±á¬áá±áá¬áá±á¬áºáá¶á¡áá áºáá»á¬ážááᯠááá·áºáá»á±á¬áºáá±á¬áá±áá¬áá»á¬ážááœáẠá¡ááá¯á¡áá»á±á¬ááºááá·áºááœááºážááá¯ááºá á±ááá·áº Schema Evolution áá«áááºáááºá á€áá±á¬ááºážáá«ážááœááºá á€áááááá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááá¯á· ááá¯ááá¯áááºááŸáá¯ááºážá áœá¬ áááºáááºáá²áá² áá±á·áá¬áá«áááºá
Table Schemas áá¬ážáááºááŒááºážá
Apache Spark ááŸá DataFrame áá
áºáá¯á
á®ááœáẠáá±áá¬á¡áá»áá¯ážá¡á
á¬ážáá»á¬ážá áá±á¬áºáá¶áá»á¬ážááŸáá·áº áááºáá¬áá±áá¬áá²á·ááá¯á·áá±á¬ áá±áá¬áá¯á¶á
á¶ááᯠáááºááŸááºáá±ážááá·áº schema áá«ááŸááááºá Delta Lake ááŒáá·áºá ááá¬ážá¡á
á®á¡á
ááºááᯠááœá±áá±ážááœá±áá°ááŸááºáááºážá¡ááœááºáž JSON áá±á¬áºáááºááŒáá·áº ááááºážáááºážáá¬ážáááºá
á¡á á®á¡á á¥áºááŒáá¹áá¬ááºážááŒááºážáá°ááẠá¡áááºáááºážá
Schema Validation áá¯áááºážáá°áááá»á¬ážáá±á¬ Schema Enforcement ááẠááá¬ážá schema ááŸáá·áºáááá¯ááºáá®áá±á¬ ááŸááºáááºážáá»á¬ážááᯠáááºáá»ááŒááºážááŒáá·áº áá±áá¬á¡áááºá¡ááœá±ážááᯠáá±áá»á¬á á±ááá·áº Delta Lake ááŸá áá¯á¶ááŒá¯á¶áá±ážááá¹ááá¬ážáá áºáá¯ááŒá áºáááºá áá°ááŒáá¯ááºáá»á¬ážáá±á¬ ááŒáá¯áááºááŸá¬áá°ááŸá¯áá®ážááá·áº á á¬ážáá±á¬ááºááá¯ááºáá áºáá¯á ááŸá±á·á á¬ážááœá²á០á¡áááºááŸááºááá²á·ááá¯á·áááºá ááá¬ážáá²ááá¯á· ááá·áºááá¯ááºáá±á¬ áá±áá¬áá±á¬áºáá¶áá áºáá¯á á®ááẠáá»áŸá±á¬áºááŸááºážáá¬ážáá±á¬ áá±á¬áºáá¶áá»á¬ážá á¬áááºážááœáẠáá«áááºááŒááºáž ááŸáá ) ááŸáá·áº á á¬áááºážáá²ááá«áá±á¬ áá±á¬áºáá¶áá»á¬ážáá«ááá·áº áááºááá·áºááŸááºáááºážááá¯áááᯠááŒááºážáááºáááºá
schema enforcement áááºáááºááá¯á·á¡áá¯ááºáá¯ááºááááºážá
Delta Lake ááẠschema-on-write checking ááá¯á¡áá¯á¶ážááŒá¯áááºá ááá¯ááá¯áááºááŸá¬ ááá¬ážááœááºáá±ážáá¬ážááá·áºá¡áá
áºáá»á¬ážá¡á¬ážáá¯á¶ážááẠá
á¬áá±ážáá»áááºá áá
áºááŸááºááá¬ážá schema ááŸáá·áº ááá¯ááºáááºááŸá¯ááŸááááŸá á
á
áºáá±ážááŒá®ážááŒá
áºáááºá schema ááẠáááá¯ááºáá®áá«áá Delta Lake ááẠááœá±áá±ážááœá±áá°ááᯠáá¯á¶ážáá¯á¶ážáá»á¬ážáá»á¬áž áá»ááºááŒááºááœá¬ážááẠ(áá±áá¬ááá±ážáá¬áž) ááŸáá·áº ááœá²ááœá²ááŸá¯ááŸáááŒá±á¬ááºáž áá¯á¶ážá
áœá²áá°á¡á¬áž á¡áááá±ážááẠááŒáœááºážáá»ááºáá
áºáᯠáá±á«áºáá±á«ááºáá¬áááºá
ááŸááºáááºážáá
áºáá¯ááẠááá¬ážáá
áºáá¯ááŸáá·áº ááá¯ááºáá®ááŸá¯ááŸááááŸá áá¯á¶ážááŒááºááẠDelta Lake ááẠá¡á±á¬ááºáá«á
ááºážáá»ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá áá±ážááá¯ááºáá±á¬ áá±áá¬áá±á¬ááº-
- áá áºááŸááºááá¬ážá á¡á á®á¡á ááºááœáẠáááŸááá±á¬ áá±á¬ááºáááºáá±á¬áºáá¶áá»á¬áž ááá«áááºááá¯ááºáá«á á¡ááŒááºá¡ááŸááºá¡á¬ážááŒáá·áºá áááºáá¬áá±á¬áá±áá¬ááœááºááá¬ážááŸáá±á¬áºáá¶áá»á¬ážáá¯á¶ážáááá«áááºáá«áá á€áá±á¬áºáá¶áá»á¬ážááᯠááá¯ážááá¯ážááŸááºážááŸááºáž null áááºááá¯ážáá»á¬ážáááºááŸááºáá±ážáááºááŒá áºáááºá
- áá áºááŸááºááá¬ážááŸá áá±á¬áºáá¶áá»á¬ážá áá±áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááŸáá·áº ááœá²ááŒá¬ážáá±á¬ áá±á¬áºáá¶áá±áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬áž ááááŸáááá¯ááºáá«á áá áºááŸááºááá¬ážáá±á¬áºáá¶ááœáẠStringType áá±áá¬áá«ááŸááááºá ááá¯á·áá±á¬áº DataFrame ááŸá áááºááá¯ááºáá¬áá±á¬áºáá¶ááœáẠIntegerType áá±áá¬áá«áááºáá±áá«áá schema enforcement ááẠááŒáœááºážáá»ááºáá áºáá¯á¡á¬áž áá¯ááºáá áºáááºááŒá áºááŒá®áž á á¬áá±ážááŒááºážáá¯ááºáá±á¬ááºááŸá¯ááᯠáá¬ážáá®ážáááºááŒá áºáááºá
- ááá á¹á áááºá¡ááœááºáᬠááœá²ááŒá¬ážáá±á¬ áá±á¬áºáá¶á¡áááºáá»á¬áž ááá«áááºááá¯ááºáá«á ááá¯ááá¯áááºááŸá¬ ááá·áºááœáẠ'Foo' ááŸáá·áº 'foo' áᯠá¡áááºáá±ážáá¬ážáá±á¬ áá±á¬áºáá¶áá»á¬ážááᯠááá¬ážáá áºáá¯áááºážááœáẠáááºááŸááºááááá«á Spark ááᯠcase-sensitive ááá¯á·ááá¯áẠcase-insensitive (áá°á) áá¯ááºááœáẠáá¯á¶ážááá¯ááºáá±á¬áºáááºáž Delta Lake ááẠcase-preserving ááŒá áºáá±á¬áºáááºáž schema storage á¡ááœááºážááœáẠá¡á¬áá¯á¶ááá¶ááá¯ááºáá«á áá±á¬áºáá¶á¡áá»ááºá¡áááºááᯠááááºážáááºážááŒá®áž ááŒááºááá¯á·ááá·áºá¡áá« áá«áá±ážááẠá¡áá±ážá¡ááœá²ááŒá áºáááºá ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ á¡ááŸá¬ážá¡ááœááºážáá»á¬ážá áá±áá¬áá»ááºá á®ážááŒááºáž ááá¯á·ááá¯áẠáá±áá¬áá¯á¶ážááŸá¯á¶ážááŒááºáž (Databricks ááœáẠáá»áœááºá¯ááºááá¯á· ááá¯ááºááá¯ááºááœá±á·ááŒá¯á¶áá²á·áááá·áºá¡áá¬) ááá¯ááŸá±á¬ááºááŸá¬ážááẠá€ááá·áºáááºáá»ááºááᯠááá·áºááœááºážááẠáá¯á¶ážááŒááºáá²á·áááºá
áááºážááᯠááá¯ááºáá±á¬áºáááºá¡ááœááºá áááºážááá¯á·ááᯠáááºáá¶ááẠáááŒááºáááºááá±ážáá±á¬ Delta Lake ááá¬ážááœáẠá¡áá áºáá¯ááºáá¯ááºáá¬ážáá±á¬ áá±á¬áºáá¶á¡áá»áá¯á·ááᯠááá·áºáááºááŒáá¯ážá á¬ážáá±á¬á¡áá« á¡á±á¬ááºáá«áá¯ááºááœáẠáá¬ááŒá áºááœá¬ážáááºááᯠááŒáá·áºááŒáá«á áá¯á·á
# СгеМеÑОÑÑеЌ DataFrame ÑÑÑÐŽ, кПÑПÑÑй ÐŒÑ ÐŽÐŸÐ±Ð°Ð²ÐžÐŒ в МаÑÑ ÑаблОÑÑ Delta Lake
loans = sql("""
SELECT addr_state, CAST(rand(10)*count as bigint) AS count,
CAST(rand(10) * 10000 * count AS double) AS amount
FROM loan_by_state_delta
""")
# ÐÑвеÑÑО ОÑÑ
ПЎМÑÑ ÑÑ
ÐµÐŒÑ DataFrame
original_loans.printSchema()
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
# ÐÑвеÑÑО МПвÑÑ ÑÑ
ÐµÐŒÑ DataFrame
loans.printSchema()
root
|-- addr_state: string (nullable = true)
|-- count: integer (nullable = true)
|-- amount: double (nullable = true) # new column
# ÐПпÑÑка ЎПбавОÑÑ ÐœÐŸÐ²Ñй DataFrame (Ñ ÐœÐŸÐ²ÑÐŒ ÑÑПлбÑПЌ) в ÑÑÑеÑÑвÑÑÑÑÑ ÑаблОÑÑ
loans.write.format("delta")
.mode("append")
.save(DELTALAKE_PATH)
Returns:
A schema mismatch detected when writing to the Delta table.
To enable schema migration, please set:
'.option("mergeSchema", "true")'
Table schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
Data schema:
root
-- addr_state: string (nullable = true)
-- count: long (nullable = true)
-- amount: double (nullable = true)
If Table ACLs are enabled, these options will be ignored. Please use the ALTER TABLE command for changing the schema.
áá±á¬áºáá¶á¡áá áºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºááá·áºááá·áºá¡á á¬ážá Delta Lake ááẠschema áá áºáá¯ááᯠáááºááŸááºááŒá®áž áá±ážáá¬ážááŒááºážááᯠáááºááá¯ááºáááºá ááœá²ááœá²ááŸá¯ááá¯ááŒá áºá á±áá±á¬ áááºááá·áºáá±á¬áºáᶠ(ááá¯á·ááá¯áẠáá±á¬áºáá¶á¡á á¯á¶) ááᯠáá¯á¶ážááŒááºáá¬ááœáẠáá°áá®áááºá¡ááœáẠSpark ááẠááŸáá¯ááºážááŸááºááŸá¯á¡ááœáẠstack trace á០schemas ááŸá áºáá¯áá¯á¶ážááᯠáá¯ááºáááºá
á¡á á®á¡á á¥áºááᯠáá»áá·áºáá¯á¶ážááŒááºážá á¡áá»áá¯ážáá»á±ážáá°ážáá¬áž á¡áááºáááºážá
schema enforcement ááẠá¡áá±á¬áºá¡áááºáááºážááŒááºáá±á¬á á áºáá±ážááŸá¯áá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áºá áá¯ááºáá¯ááºááẠááá¯á·ááá¯áẠáá¯á¶ážá áœá²áááºá¡áááºááá·áºááŒá áºááá·áº ááá·áºááŸááºážááŒá®áž á¡ááŒáá·áºá¡áááŒá±á¬ááºážáá²áá¬ážáá±á¬áá±áá¬á¡á á¯á¶á¡ááœáẠáá¶áá«ážá á±á¬áá·áºá¡ááŒá áºá¡áá¯á¶ážááŒá¯ááẠá¡áá±á¬ááºážáá¯á¶ážáááááá¬áá áºáá¯ááŒá áºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áº áá±áá¬ááᯠááá¯ááºááá¯ááºáá»áœá±ážáá±á¬ ááá¬ážáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯áááº-
- á ááºáááºáá°ááŸá¯ algorithms
- BI áááºááŸáºáá¯ááºáá»á¬áž
- áá±áá¬ááœá²ááŒááºážá áááºááŒá¬ááŒááºážááŸáá·áº á áááºáá°ážáá¯á¶áá±á¬áºááŒááºáž áááááá¬áá»á¬áž
- ááŒáá·áºáá¬ážáá±á¬ááœá²á·á ááºážáá¯á¶á ááŒááºážáááºá áœá¬ááá¯ááºáá¬ážáá±á¬ áá±á«áá¬áá¡á á®á¡á ááºáá»á¬áž ááá¯á¡ááºááá·áº áááºááá·áºáá¯ááºáá¯ááºááŸá¯á áá áºáááá¯á
á€áá±á¬ááºáá¯á¶ážá¡áá¬ážá¡áá®ážá¡ááœáẠáááºážááá¯á·ááá±áá¬ááᯠááŒááºáááºáááºá á¡áá¯á¶ážááŒá¯áá°á¡áá»á¬ážá¡ááŒá¬ážááẠáááºážááá¯á·áááá¬ážáá»á¬ážááœáẠáááºáá±á¬ááºáá¯á¶ááᯠáááŒááºážááŒááºážááááºáááºááá·áº ááá¯ážááŸááºážáá±á¬ "multi-hop" áááá¯áá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒáááºá á€á¡ááŒá±á¬ááºážááá¯ááá¯áá±á·áá¬áááºá áá±á¬ááºážáá«ážááá¯áááºá
á
áºáá±ážááá¯ááºáááºá
áá¯ááºáá«áááºá schema enforcement ááᯠááá·áºááá¯ááºááá¯ááºážáá²á· áááºáá±áá¬ááŸá¬áááᯠáá¯á¶ážááá¯ááºáá±ááá·áº áá®ááá á¹á ááŸá¬ ááá¬ážáá áºáá¯áá® streaming ááᯠá áááºááŸá¯ááºá á±ááá¯ááºáá«ááẠá¥ááá¬á áááºáá¬áá²á· data áá²ááᯠáá±á¬ááºáááºáá±á¬áºáá¶áá áºáá¯áááºááá·áºááá¯ááºáá¬ááᯠáá±á·ááœá¬ážááá¯á·áá«áá²á
Data dilution ááᯠáá¬ááœááºáá±ážááŒááºážá
á¡áá¯á¡áá»áááºááŸá¬ áááºážáá¬ááœá± ááŸá¯ááºáá±áá²ááá¯á· ááœá±ážáá±áááá·áºáááºá á¡áá°ážáááŒáá·áº áááºááẠDelta Lake ááá¯á·á¡áá áºááŒá áºáá±áá«áá áá áºáá«áá áºáá¶ááœáẠááá»áŸá±á¬áºááá·áºáá¬ážáá±á¬ "schema mismatch" á¡ááŸá¬ážáá áºáá¯ááẠááá·áºáá¯ááºáááºážá¡ááœá¬ážá¡áá¬ááœáẠááá·áºá¡á¬áž á¡ááŸá±á¬áá·áºá¡ááŸááºáá±ážááá¯ááºáá«áááºá áá»áœááºá¯ááºááẠáá»áœááºá¯ááºá DataFrame ááᯠáááºááá¯á·áááºááŒá áºá á± áá»áœááºá¯ááºá DataFrame ááᯠáá±ážááá¯ááºá á±ááẠááá¯á¡ááºáááᯠschema ááᯠá¡áááºááŒá±á¬áá·áº ááŒá±á¬ááºážáá²á á±ááááºážá
ááŸá±ážááá¯ááá¯ážá áá¬ážá¡ááá¯ááºáž "áá¬ááœááºááŒááºážáá áºá¡á±á¬ááºá ááẠáá¯áááŒááºážááááºááá¯áž" áá áºáá»áááºáá»áááºááœáẠááá·áºá¡á á®á¡á ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯áá áá¯ááºáá«áá áá±áá¬á¡áá»áá¯ážá¡á á¬áž ááá¯ááºáááºáá®ááŸá¯ ááŒá¿áá¬áá»á¬ážááẠáááºážááá¯á·á áá¯ááºááá¯ážá¡áá»ááºážáááºáá±á¬ áŠážáá±á«ááºážáá»á¬ážááᯠáá»á±á¬ááá¯ááºážááœá¬ážáááá·áºááẠ- áá áºáá¬ážáááºážááŒá áºáá¯á¶ááá±á¬ áá±áá¬á¡áááºážá¡ááŒá áºáá»á¬ážááœáẠá¡áá¬ážáááºááá á¹á áá»á¬ážá áá»ááºá á®ážáá±áá±á¬áá±á¬áºáá¶áá»á¬ážá áá¯á¶á á¶áááŸááºáá±á¬ááŒá±áá¯á¶ááœá²ááŒááºáž ááá¯á·ááá¯áẠá¡ááŒá¬ážááŒá±á¬ááºáááºááœááºá¡áá¬áá»á¬ážááᯠá áááºáá°ážáááºááŒáá·áºááẠá¡áááºáááºááá¯ážáá»á¬ážá á¡áá±á¬ááºážáá¯á¶ážáááºážáááºážááŸá¬ - schema enforcement ááŒáá·áº ááááºáá±á«ááºááœáẠá€áááºáá°áá»á¬ážááᯠáááºááá·áºááŒá®áž ááá·áºáá¯ááºáá¯ááºáá±ážáá¯ááºá áááºáá²áá±á¬á¡ááŸá±á¬ááºáá²ááœáẠáá¯ááºážá¡á±á¬ááºážáá±ááá·áºá¡á á¬áž áá±á¬ááºááá¯ááºážááœáẠáááºážááá¯á·ááᯠá¡áááºážáá²ááœáẠááá¯ááºááœááºááŒá±ááŸááºážáááºááŒá áºáááºá
ááá¬ážááœááºááᯠááá¯ááºáá¬ááŒááºážá á¡ááŒá±á¬ááºážá¡áá²ááᯠáááºá¡áááºááŒá¯ááá±ážáá«á ááá·áºááá¬ážááá¯á¶á á¶ááẠááŒá±á¬ááºážáá²áááºááá¯ááºááŒá±á¬ááºáž á¡á¬ááá¶áá»ááºáá±ážáááºá áááºážááẠáá±á¬áºáá¶á¡áá áºáá»á¬ážááᯠáááŒá¬áá áá±á«ááºážááá·áºáá±á¬á¡áá«ááœáẠáá±áá¬áá»á¬áž áá»á±á¬á·ááœá¬ážááŒááºážááᯠáá¬ážáá®ážáá±ážáá«áááºá ááááºá áááºááá¯ážááŸááá±á¬á áá»á¯á¶á·áá¬ážáá±á¬ ááá¬ážáá»á¬ážááẠáá±áá¬áá»á¬áž áá±áá»áŸá¶ááŸá¯ááŒá±á¬áá·áº á¡áááá¹áá«ááºááŸáá·áº á¡áá¯á¶ážáááºááŸá¯ áá¯á¶ážááŸá¯á¶ážááœá¬ážááá¯ááºáááºá ááá·áºá¡á¬áž áááºááœááºáá»ááºááŸáááŸáááŒá áºá á±áááºá ááŒáá·áºáá¬ážáá±á¬á á¶ááŸá¯ááºážáá»á¬ážáá»ááŸááºáᬠá¡áááºá¡ááœá±ážááŒáá·áºáá¬ážááŸá¯ááᯠáá»áŸá±á¬áºááá·áºááŒááºážááŒáá·áºá schema enforcement ááẠáááºážáá¯ááºáá±á¬ááºááẠáá®ááá¯ááºážáá¯ááºáá¬ážááá·áºá¡ááá¯ááºáž áá¯ááºáá±á¬ááºáá±ážáááºâááá·áºá¡á¬áž á¡ááá áááºááŸááá±áááºááŸáá·áº áááºáá á¬áááºážááá¬ážáá»á¬ážááᯠááá·áºááŸááºážá á±ááẠáá°áá®áá±ážáá«áááºá
áááºáá±á¬ááºážá ááºážá á¬ážááẠáááºážááááºáá² áá¯á¶ážááŒááºááŸá¬ ááá¯á¡áẠáá±á¬áºáá¶á¡áá áºáá áºáá¯ááá·áºáá« - ááŒá¿áá¬áááŸááá«á á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáááºááŸá¬ á á¬ááŒá±á¬ááºážáá áºááŒá±á¬ááºážáááºážááŒá áºáááºá ááŒá±ááŸááºážáá»ááºááẠcircuit áááá·áºáá²ááŒá áºá ááºááŒá áºáááºá
schema ááá·áºáá²ááŒá áºá ááºááá¯áá¬áá¬áá²á
Schema ááá·áºáá²ááŒá áºá ááºááẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬áž á¡áá»áááºááŸáá·áºá¡áá»áŸááŒá±á¬ááºážáá²áá±áá±á¬áá±áá¬á¡á áááºááŸáááá¬ážáá¯á¶á á¶ááᯠá¡ááœááºááá°ááŒá±á¬ááºážáá²ááá¯ááºá á±ááá·áº á¡ááºá¹áá«áááºáá áºáá¯ááŒá áºáááºá áá±á¬áºáá¶á¡áá áºáá áºáᯠááá¯á·ááá¯áẠáá áºáá¯áááºááá¯áá±á¬áá±á¬áºáá¶á¡áá áºáá»á¬ážáá«áááºááẠschema ááᯠá¡ááá¯á¡áá»á±á¬ááºááá¯ááºáá»á±á¬áá®ááœá±ááŒá áºá á±áááºá¡ááœáẠáá±á¬ááºáááºááœá²áá áºáᯠááá¯á·ááá¯áẠááŒááºáááºáá±ážááŒááºážáá¯ááºáá±á¬ááºááá·áºá¡áá«ááœáẠáááºážááᯠá¡áá»á¬ážáá¯á¶ážá¡áá¯á¶ážááŒá¯áááºá
schema ááá·áºáá²ááŒá áºá áẠáááºááá¯á·á¡áá¯ááºáá¯ááºááááºážá
ááááºá¡ááá¯ááºážá០ááá°áá¬ááᯠááá¯ááºáá¬ááŒááºážááŒáá·áºá developer áá»á¬ážááẠschema ááœá²ááœá²ááŸá¯ááŒá±á¬áá·áº ááááºá áááºáá»áá¶áá²á·ááá±á¬ áá±á¬áºáá¶á¡áá
áºáá»á¬ážááᯠááá·áºááœááºážáááºá¡ááœáẠáá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá»á¬ážááẠschema ááá·áºáá²ááŒá
áºá
ááºááᯠá¡ááœááºááá° á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áá±á«ááºážááá·áºááŒááºážááŒáá·áº circuit ááá·áºáá²ááŒá
áºá
ááºááᯠá¡áááºááœááºážáááºá .option('mergeSchema', 'true')
áááºážáá²á· Spark á¡ááœá²á·áá® .write ОлО .writeStream.
# ÐПбавÑÑе паÑаЌеÑÑ mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)
ááááºááá¯ááŒáá·áºáááºá á¡á±á¬ááºáá« Spark SQL query ááᯠrun áá«á
# СПзЎайÑе гÑаÑОк Ñ ÐœÐŸÐ²ÑÐŒ ÑÑПлбÑПЌ, ÑÑÐŸÐ±Ñ Ð¿ÐŸÐŽÑвеÑЎОÑÑ, ÑÑП запОÑÑ Ð¿ÑПÑла ÑÑпеÑМП
%sql
SELECT addr_state, sum(`amount`) AS amount
FROM loan_by_state_delta
GROUP BY addr_state
ORDER BY sum(`amount`)
DESC LIMIT 10
áá
áºáááºážá¡á¬ážááŒáá·áº Spark á
ááºááŸááºáá
áºáá¯áá¯á¶ážá¡ááœáẠá€ááœá±ážáá»ááºááŸá¯ááᯠááá·áºááœááºážááŒááºážááŒáá·áº áááºáááºááŸááºááá¯ááºáááºá spark.databricks.delta.schema.autoMerge = True
Spark configuration ááá¯á·á ááá¯á·áá±á¬áº schema enforcement ááẠááá·áºá¡á¬áž ááááºááœááºáá² schema ááœá²ááœá²ááŸá¯áá»á¬ážááᯠááááá±ážáá±á¬á·áááºááŒá
áºáá±á¬ááŒá±á¬áá·áº áááºážááᯠáááááŒáá·áºá¡áá¯á¶ážááŒá¯áá«á
áá±á¬ááºážááá¯ááŸá¯ááœáẠáá«áá¬áá®áá¬ááᯠááá·áºááœááºážááŒááºážááŒáá·áº mergeSchema
DataFrame ááœááºáá«áááºáá±á¬áºáááºáž áá
áºááŸááºááá¬ážááœááºááá«áááºááá·áº áá±á¬áºáá¶á¡á¬ážáá¯á¶ážááᯠá
á¬áá±ážááŒááºážáá¯ááºáááºážááá
áºá
áááºáá
áºááá¯ááºážá¡ááŒá
Ạschema áá¡áá¯á¶ážááœáẠá¡ááá¯á¡áá»á±á¬ááºááá·áºááœááºážáá«áááºá Nested á¡ááœááºáá»á¬ážááá¯áááºáž ááá·áºááá¯ááºááŒá®áž áááºááá¯ááºáá¬ááœá²á·á
ááºážáá¯á¶áá±á¬áºáá¶áá»á¬ážáá¡áá¯á¶ážááœáẠáááºážááá¯á·ááá¯áááºáž áá±á«ááºážááá·áºáááºááŒá
áºáááºá
áá±áá¬á¡ááºáá»ááºáá®áá¬áá»á¬ážááŸáá·áº áá±áá¬áááá¹áá¶ááá¬ááŸááºáá»á¬ážááẠáá±á¬áºáá¶á¡áá áºáá»á¬áž (áááŒá¬áá±ážáá®á ááŒá±áá¬áá¶ááá¯ááºáá±á¬ áááºááá Ạááá¯á·ááá¯áẠááá¯áá á¡áá±á¬ááºážá áœááºážáá±á¬ááºáááºáá±á¬áºáá¶) ááœáẠáá±á¬áºáá¶á¡áá áºáá»á¬ážááá·áºááẠá€ááœá±ážáá»ááºááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºááŒá®áž áááºážááá¯á·á áááºááŸáá ááºáááºáá°ááŸá¯áá¯ááºáá¯ááºááŸá¯ááá¬ážáá»á¬ážááœáẠáá±á¬áºáá¶á¡áá±á¬ááºážáá»á¬ážááᯠá¡ááŒá±áá¶á áá±á¬áºáááºáá»á¬ážááᯠáá»áá¯ážáá»ááºááŒááºážáááŒá¯áá²á
ááá¬ážáá áºáá¯áááºááá¯ážááŒááºáž ááá¯á·ááá¯áẠááŒááºáááºáá±ážáá±á ááºá¡ááœááºáž á¡á±á¬ááºáá« schema ááŒá±á¬ááºážáá²ááŸá¯á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠschema ááá·áºáá²ááŒá áºá ááºá áá áºá áááºáá áºááá¯ááºážá¡ááŒá Ạááœáá·áºááŒá¯áááº-
- áá±á¬áºáá¶á¡áá áºáá»á¬ážááá·áºááŒááºáž (áááºážááẠá¡ááŒá áºá¡áá»á¬ážáá¯á¶áž ááŒááºááœááºážááŒá áºáááº)
- NullType -> á¡ááŒá¬ážá¡áá»áá¯ážá¡á á¬ážá០áá±áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠááŒá±á¬ááºážáá²ááŒááºáž ááá¯á·ááá¯áẠByteType -> ShortType -> IntegerType á០ááŒáŸáá·áºáááºááŒááºáž
schema ááá·áºáá²ááŒá
áºá
ááºá¡ááœááºáž ááœáá·áºáááŒá¯áá±á¬ á¡ááŒá¬ážááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠschema ááŸáá·áº data ááᯠáá±á«ááºážááá·áºááŒááºážááŒáá·áº ááŒááºáááºáá±ážáá¬ážááẠááá¯á¡ááºááẠ.option("overwriteSchema", "true")
. á¥ááá¬á¡á¬ážááŒáá·áºá áá±á¬áºáᶠ"Foo" ááẠáá°áá ááááºážááŒáá·áºááŒá
áºááŒá®áž schema á¡áá
áºááẠstring data type ááŒá
áºáá«áá Parquet(data) ááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶áž ááŒááºáááºáá±ážáá¬ážááẠááá¯á¡ááºáááºááŒá
áºáá«áááºá á€áá²á·ááá¯á·áá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážáá«áááºáááº-
- áá±á¬áºáá¶ááá¯áá»ááºááŒááºážá
- ááŸáááŒá®ážáá¬áž áá±á¬áºáá¶áá áºáá¯á áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠááŒá±á¬ááºážáá²ááŒááºáž (áá±áá¬)á
- ááá á¹á á¡ááœááºáᬠááœá²ááŒá¬ážáá±á¬ áá±á¬áºáá¶áá»á¬ážááᯠá¡áááºááŒá±á¬ááºážááŒááºáž (á¥ááá¬á "Foo" ááŸáá·áº "foo")
áá±á¬ááºáá¯á¶ážááœááºá Spark 3.0 ááá±á¬ááºááœááºááŸáááŸá¯ááŸáá·áºá¡áá°á áááá»ááŒááºáá¬ážáá±á¬ DDL ááᯠá¡ááŒáá·áºá¡ááá¶á·ááá¯ážáá±ážááẠ(ALTER TABLE ááá¯á¡áá¯á¶ážááŒá¯á) áá¯á¶ážá áœá²áá°áá»á¬ážááẠááá¬ážááœááºáá¯á¶á á¶áá»á¬ážáá±á«áºááœáẠá¡á±á¬ááºáá«áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááœáá·áºááŒá¯áááº-
- áá±á¬áºáá¶áá»á¬ážááá·áºááŒááºážá
- áá±á¬áºáᶠááŸááºáá»ááºáá»á¬áž ááŒá±á¬ááºážáá²ááŒááºážá
- ááœá±áá±ážááœá±áá°ááŸááºáááºážááᯠááááºážáááºážááá·áºá¡áá»áááºááᯠáááºááŸááºááŒááºážáá²á·ááá¯á·áá±á¬ ááá¬ážáá¡ááŒá¯á¡áá°ááᯠááááºážáá»á¯ááºááá·áº ááá¬ážáá¯ááºááá¹áááá»á¬áž áááºááŸááºááŒááºážá
áááºáááºážááá·áºáá²ááŒá áºá ááºá á¡áá»áá¯ážáá»á±ážáá°ážáá¬áž á¡áááºáááºážá
Schema ááá·áºáá²ááŒá áºá ááºááᯠáááºá¡áá»áááºááá¯ááºážááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áááºááœááºáááºá ááá·áºááá¬ážá schema ááá¯ááŒá±á¬ááºážáá« (ááá¯áá±áá¬ááœáẠáááŒá áºááá·áºáá±á¬ áááºá DataFrame ááá¯á· áá±á¬áºáá¶áá»á¬ážááᯠááá±á¬áºáá ááá·áºááá¯ááºáá±á¬á¡áá«ááŸáá·áº ááá·áºáá»ááºáááºááŒá áºáááº)á áááºážááẠááŸááºáááºáá±á¬áá±á¬áºáá¶á¡áááºáá»á¬ážááŸáá·áº áá±áá¬á¡áá»áá¯ážá¡á á¬ážáá»á¬ážááᯠá¡ááá¡áááºážááŒá±áá¬á áá¬áááá¯áá² ááá·áºá¡á á®á¡á ááºááᯠááŒá±á¬ááºážááœáŸá±á·ááẠá¡ááœááºáá°áá¯á¶ážáááºážáááºážááŒá áºáááºá
áá±á¬ááºáá»ááº
Schema enforcement ááẠááá·áºááá¬ážááŸáá·áº ááá¯ááºáá®ááŸá¯áááŸááá±á¬ áá±á¬áºáá¶á¡áá áºáá»á¬áž ááá¯á·ááá¯áẠá¡ááŒá¬ážáá±á¬ schema á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠááŒááºážáááºáááºá á€ááŒáá·áºáá¬ážáá±á¬á á¶ááŸá¯ááºážáá»á¬ážááᯠáááºááŸááºááááºážááááºážááŒááºážááŒáá·áºá áá±á·áá¬áá¯á¶ážáááºáá°áá»á¬ážááŸáá·áº á¡ááºáá»ááºáá®áá¬áá»á¬ážááẠáááºážááá¯á·ááá±áá¬ááẠááá¯ááºáá¬ááŸá¯á¡ááŒáá·áºáá¯á¶ážá¡ááá·áºááŸáááŒá±á¬ááºáž áá¯á¶ááŒááºááá¯ááºááŒá®áž áááºážááᯠááŸááºážáááºážááŒááºáá¬ážá áœá¬ áááºááœááºááá¯ááºááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºáá±á¬ á á®ážááœá¬ážáá±ážááá¯ááºáᬠáá¯á¶ážááŒááºáá»ááºáá»á¬ážáá»ááá¯ááºá á±áááºááŒá áºáááºá
á¡ááŒá¬ážáá áºáááºááœááºá schema ááá·áºáá²ááŒá áºá ááºááẠááá¯ážááŸááºážá á±ááŒááºážááŒáá·áº ááŒáá¹áá¬ááºážáá»ááºáá»á¬ážááᯠááŒáá·áºá áœááºáá±ážáááºá á áœááºá áœá²áááºá á¡ááá¯á¡áá»á±á¬áẠschema á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá ááŒá®ážáá±á¬ááºá áá±á¬áºáá¶áá áºáá¯ááá·áºááẠááááºáá²ááá·áºáá«á
á¡á á®á¡á á¥áºáá¡áááºážá¡ááŒááºá¡áá¯á¶ážáá»ááŸá¯ááẠáááºááŒá áºááŒá®ážá á¡á á®á¡á á¥áºáááá·áºáá²ááŒá±á¬ááºážáá²ááŸá¯ááŸá¬ áááºááŒá áºáááºá ááœá²áá¯á¶ážáá±á¬á¡áá«ááœááºá á€á¡ááºá¹áá«áááºáá»á¬ážááẠáá°áá¶áá¶áá»á¬ážááᯠááááºážááŸááá±ážááŒá®áž á¡áá»ááºááŒáá»áááºááŸáááŒááºážááᯠááááºáááẠááá¯ááá¯ááœááºáá°á á±áááºá
Mukul Murthy ááŸáá·áº Pranav Anand ááá¯á·ááá¯áááºáž á€áá±á¬ááºážáá«ážá¡ááœáẠáááºážááá¯á·á áá¶á·ááá¯ážáá°áá®ááŸá¯áá»á¬ážááá¯áááºáž áá»á±ážáá°ážáááºááŸááá«áááºá
á€á á®ážáá®ážááŸá á¡ááŒá¬ážáá±á¬ááºážáá«ážáá»á¬áž-
áááºá ááºáá±á¬ááºážáá«ážáá»á¬áž
source: www.habr.com