αα½ααααΈ α αΆα! αααα»αααΌααααα αΆαααΌαα’αααααΌαααΆαααααααα’ααααα
αα·αααααα ααΌα ααΆαααα·αααααααααααΎααααα»ααααααΌααααα»α αα·ααα·ααααα₯ααααααα ααΎααααΈαααα ααααΌααααΌαα α·αααααααααΎααααα·αααααααααΌαααααααααααα½ααα ααΉααα·ααααααααααΈ ααααα½αα ααα½αααΆααα·ααΆαααααααΈβαα·ααΈααααΈααααΆαααααααα’αααΈαααααΎααα·αααΉαααΈαα»αα ααααΌααααΌαα α·αααααΆααααααα·ααα»αααααΆα αααΎαααΈαααααααΆαααααΆααΆαααααααααααΈαααααααααΎαα αΆααααααΆαα αα·αααααΎαααΆαααααααΆαααααΈα
αααααΆαααΎααα αααα αΆααααΆαααααααααααααααααΆαααα αααααΆααααα αΆααααα αα·ααααααΌαααΆαα’αΆααΈαααααααααΆααααααΌαααΆααααααααΆ αα ααΆαααααααααα·ααααααααααα’αααααααΌα ααααΆαααα Delta Lake ααααΎα±ααααΆααΆααααα½ααααα»αααΆαααααΆαααΆαααΆαααααααααΈαα αααααααα·ααααααααααΆααααααΌαα α’αααβααααΎβααΆαβαα·αααα·βα αΌαβααααΎβααΆαααβααΆααααβααΎααααΈβαααααααααβααΆααΆαβαααααααΆαααβααααβαα½αααα α§αααααααΆααααααα½αααΆα Schema Enforcement αααααΆαααΆαα’αααααααΎααααΆααααΈααΆααααα»αααΆααΆααααααα½ααααααα’α ααααΆααΆαα½αααΉαααα α»α α¬αα·ααααααααααα·αα αΆαααΆα α αα·α Schema Evolution αααα’αα»ααααΆαα±αααα½αααααααΈαααα·ααααααααΆααααααααααΌαααΆααααααααααααααααααααααα·αα ααΈααΆααααααααα αα αααα»αα’αααααααα ααΎαααΉαααααααααααΆαααααααΈααααα αααα»αααΆαααααΎα§αααααααΆαααααα
ααΆααααααΉαα’αααΈαααααααΆαααααΆααΆα
DataFrame ααΈαα½αααα
αααα»α Apache Spark ααΆααααααααΆααααααααααααααααααααα·αααααα ααΌα
ααΆαααααααα·αααααα αα½ααα αα·ααα·ααααααααααΆα ααΆαα½α Delta Lake αααααααΆαααααΆααΆαααααΌαααΆααααααΆαα»αααΆαααααα JSON αα
ααΆααααα»ααααααα ααα»ααααα·ααααα·ααΆαα
ααΎααΆαα’αα»αααααααααααΆαααααΊααΆα’αααΈ?
Schema Enforcement αααααααΌαααΆαααααααΆαααααααααΆααΆ Schema Validation ααΊααΆααααααΆααα»ααααα·ααΆααα½ααα αααα»α Delta Lake αααααΆααΆααΌααα»αααΆααα·αααααααααααα·ααααααααααααΆααααα·αααααΌααααααΉααααααααΆαααααααααΆααΆαα ααΌα ααΆααα αΆαααααααα αα»ααΆααα»ααααααααΈαααααΆααααααΆαααααΆααααααααααα·αααα½α ααΆααα·αα·αααααΎαααΆααΎαα½αααααΈαα½αααααα·αααααααααααΆααααα αΌααα αααα»αααΆααΆαααΊαα αααα»ααααααΈαααααααΌαααααΆαααα½ααααααααααΉααα»α (αα·ααΆααααααΆααααααΆααΎααΆα "ααΆαααα" αααααΆαααα½αααααααΆαααα¬α’ααα ) αα·αααα·αααααΆαααααααααααΆαααααΆααα½αααααααα·αααΆααα αααα»ααααααΈα
ααΎααΆαα’αα»αααααααααααΆαααααααΎαααΆααααΆαααΌα ααααα ?
Delta Lake ααααΎ schema-on-write checking αααααΆααααααΆααΆααααααααααΈααΆααα’αααα
ααΆααααΆααΆαααααΌαααΆααα·αα·ααααααααΆααααΆαααααααΆααΆαα½αααΉααααααααΆαααααααΆααΆαααααα
αα
ααααααααα ααααα·αααΎαααααααΆααααα·αααααααααΆααα Delta Lake ααααααααααα·ααααα·ααΆαααΆαααααα»α (αα·αααΆααα·ααααααααααΌαααΆαααααα) α αΎαααΎαααααΈααΎαααααα½αααΎααααΈααΌαααααΉααααα’αααααααΎααααΆααα’αααΈααΆααα·ααααΈαααααΆααααααΆα
Delta Lake ααααΎα
αααΆααααΆααααααααΎααααΈαααααααΆααΎαααααααααΆααααΌαααααΆααΆαα½αααΆααΆαα¬α’ααα ααα»ααα·αααααααααα’αΆα
αααααααΆαα
- αα·αα’αΆα ααΆααα½αααααααααααααα·αααΆααα αααα»ααααααααΆαααααααΆααΆαααααα α αααα»ααα αα·α α’αααΈααααααααΆαααΊααα’ααααα·αααΎαα·ααααααα αΌααα·αααΆααα½αααααΆααα’ααααΈααΆααΆα - αα½αααααΆαααααααΉαααααΌαααΆααααααααααααααα
- αα·αα’αΆα ααΆααααααααα·αααααααα½αααααααα»αααΈαααααααα·αααααααααα½ααααααα»αααΆααΆαααααα ααα ααααα·αααΎαα½αααααΆααΆαααααα ααΆααα·αααααα StringType ααα»αααααα½ααααααααααΌαααααΆαα αααα»α DataFrame ααΆααα·αααααα IntegerType αααααΆαα’αα»αααααααααααΆαααααΉααααααααΈααΎαααααα½α αα·αααΆαααΆαααΆααααααααΈααααα·ααααα·ααΆαα
- αα·αβα’αΆα βααΆαβαααααβαα½αβααβαααβαα»αβααααΆβααβαααα»αβααααΈβααα»αααααα αααααΆααααααΆα’ααααα·αα’αΆα ααΆααα½ααααααααΆααααααααΆ 'Foo' αα·α 'foo' αααααΆαααααααααα»αααΆααΆααααα½αα ααααααααα Spark α’αΆα ααααΌαααΆαααααΎαα αααα»ααα»αααΆα case-sensitive α¬ case-insensitive (default) mode, Delta Lake ααΊβααΆβ case-preserving ααα»ααααβααΊ insensitive αα αααα»αβ schema storageα Parquet ααΊαααααΆααα’ααααααΌα αααα ααααααααΆαα»α αα·ααααα‘ααααααααΆααα½αααα ααΎααααΈαααααΆαααα α»ααααα’αΆα ααΎαααΆα ααΆαααΌα αα·αααααα α¬ααΆαααΆααααααα·αααααα (α’αααΈαα½ααααααΎααα½ααααααααααΆαααα 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 ααΆαααααααααΆαααα αΎαααααααααα ααΎααααΈαα½ααααααααΆααΎαα½ααααα½αααΆ (α¬αααα»ααααα½ααα) ααααααααΆαα±ααααΆαααΆααα»αααααΆααα Spark αααα αααααααααΆαααααΆααααΈαααΈααΆαααααααααΆααααΆαααααααααα
ααΎα’αααΈααΆα’αααααααααααααααΆαα’αα»αααααααααααΆααα?
αααααΆαααααΆαα’αα»αααααααααααΆαααααΊααΆααΆααααα½ααα·αα·αααααααΉααααΉααα½α ααΆααΊααΆα§αααααααααα’αα½ααααα»αααΆαααααΎααααΆααααΆα’αααααΆαααααΆααα ααΆαααααα»ααα·αααααααααααΆαααααΆααααααΌααααααα αα·αααα’αΆα αααααααααα½α ααΆααααα αααααΆααααΆαααα·α α¬ααααΎααααΆααα ααΆααααααΆααααΌαααΆαα’αα»ααααα ααααααΆααΆααααααααααα·αααααααααααααΆααα
- αααα½ααααααααΆαααΆαααααααΆαααΈα
- ααααΆααααααααααα BI
- α§ααααααα·ααΆααα·αααααα αα·αααΌαααΆα
- ααααααααααα·αααααααΆαα½αααααααααΌαα±ααααΆααα ααΆααααααααααααα αα·αααΆααααα αΌααααΆαααααΆααααΌααααααααΆααα semantic α
ααΎααααΈαααα
ααα·αααααααααααα½ααααααααΆααα§αααααα
α»ααααααααα α’αααααααΎααααΆααααΆα
αααΎαααααΎααααΆαααααααα "αα α»α α" ααΆαααααααααααΆααα
ααΆααααααααααααα·α
ααααααα
αααα»αααΆααΆααααααα½αααα ααΎααααΈααααααααααααααα’αααΈααΏαααα α’αααα’αΆα
αα·αα·αααααΎαα’ααααα
ααΆααΆααα·αααΆαα ααΆαα’αα»αααααααααααΆαααα’αΆα ααααΌαααΆαααααΎαα ααααααααΆαα½ααα αααα»αααααααααα αΌααααααααααα’ααα ααα»ααααααααΌαα αΆαααΆααΆαααααΆααα ααΆααααΆααΆααααα»αααααΈαααα’αΆα ααΆααΆαααα α·ααα αααααααΆα§ααΆα ααα α’αααααααα ααΆα’αααααΆααααααααα½ααααα½αααααα αα·ααααααα αΌαα
ααΆαααΆαααΆαααααΆααα·αααααα
ααβαααβαααβααα α’αααβαααα ααβααΆβαααααβα αΎα ααΎβααΆαβααΏαβα’αΈβαααα? αααΆαααΆαα·α αααααααααα α»α "αααααααΆααααα·ααααΈααααΆ" ααααα·αααΉαααααΆααααα’αΆα ααααΎα’ααα’αααα‘αΎααααα»αααααΎαααΆαααΆαααΆαααααα’ααα ααΆαα·αααααααα·αααΎα’αααααΎαααΉαααΎα Delta Lake α α ααα»α’αααΈααΆαααΆαα·αα’αα»ααααΆαα±αα schema ααααΆααααααΌαααΆααααααΌαααΆα ααΌα αααααααα»αα’αΆα ααααα DataFrame αααααααα»ααα·αααΆααΆααααα αΆα’αααΈ?
ααΌα βααΆαααβα αΆααβαααβααΆ βααΆαβααΆαααΆαβαα½αβα’ααβααΊβααΆαβαααααβαααα»αβααΆαβααααΆααΆαβαα½αβαααβα αα α ααα»α αααα ααααα·αααΎα’ααααα·αααα α·ααααα»αααΆαααααα»αααΆαα’αα»αααααααααααΆαααααααα’ααααα αααα αΆααΆαααααΌαααααΆαααααααααα·ααααααααΉααα ααΈαααααααααΆαααα’αΆααααααααααα½ααα - ααααααα·αααααααα αααα αΆααααΌα ααΆααΌα ααααΆα’αΆα ααΆαααααΈααα αα½ααααααααΌα ααΆαααααΎαααααΈαα»α α¬ααΏααα½αα±ααααααΆα ααααααααααααα»αα·αα’αααΈαα αααα»α αα»αα·αααα’αΆαααααα αα·ααΈααΆαααααααααα’αααα»αααΊαααααααααααΌαααΆααααααα α αααααααΆα - ααΆαα½αααΉαααΆαα’αα»αααααααααααΆααα - αα·ααααααααΆαααΆαα½ααα½ααααα αααα»ααααααΊ ααΆααΆααα αααααααααα αααααααα½αααα αΆααααααΎαααΆαααααα½ααα αααα»αααααα αααΉαααααΌαααα·αααααααααα’αααα
ααΆααααααΉααααααααΆααααααααα±ααα’αααααΌαααΆαααΆααΆααΆαααααααΆαααααΆααΆαααααα’αααααΉααα·αααααΆααααααΌααααα»αααααΆααα’ααααααααααααΎααΆαααααΆααααααΌαα ααΆααΆαααΆαααΆαααααΆααα·αααααα αααα’αΆα ααΎαα‘αΎααα αααααααα½αααααααΈααααΌαααΆαααααααααΆααΉαααΆαα αααααΆααΆααααααΆααααα αΆαααααααΆααααααααΈαα»αααΆαααααα’αααααα αα·αααΆααααααααααααααΆαααΆαααααα·α αα·ααααααα ααΆααααααΆαααΎαααΉαα α·αααα±ααα’αααααΆαα ααααΆ ααααααααααααΆαααααα αα·αααααΉαααΆααΉαααΆααα»αααΆαααααα ααΆαα’αα»αααααααααααΆααααα·αααΆααααΎααΌαα’αααΈαααααΆααααΌαααΆααα ααΆα‘αΎαααΎααααΈααααΎ - αα½αα’αααα±αααααααΆααα·ααααααααα αα·ααααα’αΆαααααα αααααΈααααα’αααα
ααααα·αααΎα’ααααα·α αΆαααΆαααααααααα’ααααααααα α α·αααααΆα’ααααα·αααΆ ααααΌαααΆα αααααααα½αααααααΈ - ααααΆααααα αΆαα ααΆααααααααΊααΆααΆααα½ααα»ααα½ααα½αα αααααααααΆαααΊααΆααα·ααααααααααααααΈ!
ααΎααΆααα·αααααααααααααααΆαααααΊααΆα’αααΈ?
Schema evolution ααΊααΆαα»αααΆααααα’αα»ααααΆαα±ααα’αααααααΎααααΆααααααΌααααααααΆαααααΆααΆααα αα α»ααααααααΆααααΆαααΆααααα½αααααα ααΆααα·αααααααααααααΆααααααΌαααΆααααααααΆα ααΆβααααΌαβααΆαβααααΎβααΉαααΆααβαααα»αβαα βαααβααααΎβααααα·ααααα·ααΆαβααααααβα¬βαααααβα‘αΎαβαα·αβααΎααααΈβαααααβαααααααΆαααβαααβαααααβαααααααα·βααΎααααΈβαα½αβαααα αΌαβαα½αβααβααααΈβαα½αβα¬βα αααΎαα
ααΎβααΆαβαα·ααααααβααβαααααααΆαααβααααΎαααΆαβαααβααααβααΆ?
ααΆαα§ααΆα αααααΈααααααα»α α’αααα’αα·ααααααα’αΆα
ααααΎααΆααα·αααααααααααααΆααααααΆαααΆααααα½αααΎααααΈαααααααα½αααααααΈαααααααΌαααΆαααα·αααααΈαα»ααααααΆαααααΆααα·ααααΈααααΆαααααααααΆαααα ααΆααα·ααααααααααααΈααααΌαααΆαααααΎα±ααααααααααααΆααααααα .option('mergeSchema', 'true')
αα
αααα»α Spark ααααα’αααα .write ΠΈΠ»ΠΈ .writeStream.
# ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ mergeSchema
loans.write.format("delta")
.option("mergeSchema", "true")
.mode("append")
.save(DELTALAKE_SILVER_PATH)
ααΎααααΈααΎαααααΆα αα ααΌαααααΎαααΆααααα½α Spark SQL ααΆαααααα
# Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π³ΡΠ°ΡΠΈΠΊ Ρ Π½ΠΎΠ²ΡΠΌ ΡΡΠΎΠ»Π±ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ΄ΡΠ²Π΅ΡΠ΄ΠΈΡΡ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΡ ΠΏΡΠΎΡΠ»Π° ΡΡΠΏΠ΅ΡΠ½ΠΎ
%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 α ααα»ααααααααΎααΆααααααα»ααααααααα αααααααΆαα’αα»αααααααααααΆαααααΉααααααΌαααααΉαα’αααα
ααααααΆααα·ααααΈααααΆαααααααααΆααααααα’α
ααααΆα
ααααα½ααααα
αΌααααΆαααΆαααααααα
αααα»αααααΎ mergeSchema
αα½αααααΆααα’αααααααΆααα
αααα»α DataFrame ααα»αααααα·αααααα
αααα»αααΆααΆαααααα
ααααΌαααΆααααααααααααααααααααααα·αα
α
α»ααααα
αααααααααααΆααααααααΆααααααα½αααααααα·ααααα·ααΆααααααα ααΆαβαααβααΆαβααααααβααβα’αΆα
βααααΌαβααΆαβααααααβααα α αΎαβααΆααβαααβααβααΉαβααααΌαβααΆαβααααααβαα
βα
α»αβαα½αβααβαα
ααΆααααααααβαααβααααΌαβααααΆβαααα
αα·αααααααΆαααα·α αααα αα·αα’ααααα·ααααΆααΆααααααα·ααααααα’αΆα ααααΎαααααΎααααααΎααααΈαααααααα½αααααααΈ (αααα ααααΆαααααααααααΆαααΆαααΆαααααΈαααα α¬αα½αααααΆαααααααα»αααααα) αα ααΆααΆαααα·αααΆαααααααΆαααΈααααααΆαααααΆαααααααα½αααααααα·αααααααααΌααααααααΆαααααΆαααααααα’ααααΎαα½αααα αΆααα
ααααααααααΆαααααΆααααααΌααααααααΆαααααΆααααααααααΌαααΆαα’αα»ααααΆαααΆαααααααααΆααα·αααααααααααααααΆααααααα»αα’αα‘α»ααααααααααααΆααΆα α¬αααααα‘αΎααα·αα
- ααΆααααααααα½αααααααΈ (αααααΊααΆααααΆααΈαααΌααΌαα αααα»α)
- ααΆαααααΆααααααΌααααααααα·ααααααααΈ NullType -> αααααααααααααα α¬ααααααααααΆαααΈ ByteType -> ShortType -> IntegerType
ααΆαααααΆααααααΌαααααααααααααα·αααααΌαααΆαα’αα»ααααΆααα
αααα»αααΆααα·αααααααααααααΆααα αααααΌαα±αα αααααααΆααα αα·ααα·ααααααααααΌαααΆααααααα‘αΎααα·αααααααααα .option("overwriteSchema", "true")
. α§ααΆα ααα αααα»αααααΈααααα½ααα "Foo" ααΎαααααΌαααΆα
ααα½αααα α αΎααααααααΆαααααααΈααΊααΆαααααααα·ααααααααααα’αααα αααα―αααΆα Parquet (αα·αααααα) ααΆααα’ααααΉαααααΌααααααα‘αΎααα·αα ααΆαααααΆααααααΌααααααααα½αααΆα:
- ααΆααα»ααα½ααα
- ααααΆααααααΌααααααααα·αααααααααα½ααααααααΆαααααΆαα (αα ααΉααααααα)
- ααααΌαααααααα½αααααααα»αααααΆαααααα»αααααΈ (α§ααΆα ααα "Foo" αα·α "foo")
ααΆα α»αααααα ααΆαα½αααΉαααΆαα ααααααΆααααααΆαααα Spark 3.0 DDL α αααΆααααΆααααΉαααααΌαααΆαααΆαααααααΆααααααα (αααααααΎ ALTER TABLE) αααα’αα»ααααΆαα±ααα’αααααααΎααααΆααα’αα»αααααααααααΆαααΌα ααΆααααααααΎαααααααΆαααααΆααΆαα
- ααΆααααααααα½ααα
- ααΆαααααΆααααααΌαααα·ααααααα½ααα
- ααΆαααααααααααααααααααα·ααΆααΆαααααααααααααα₯αα·ααΆααααααααΆααΆα ααΌα ααΆααΆααααααααααααααααααααα ααα»ααααα·ααααα·ααΆαααααΌαααΆααααααΆαα»αα
ααΎα’αααΈααΆα’αααααααααααααααΆααα·ααααααααααααΈ?
ααΆααα·αααααααααααααΆαααα’αΆα ααααΌαααΆαααααΎαα αααααΆααααΆα ααΆααααα ααααΆααααααΌααααααααΆαααααααΆααΆαααααα’ααα (αααα»αααΈααααααα’ααααααααααα½ααααααα ααααααα DataFrame ααααα’αααααααα·ααα½ααα ααΈααα)α αααααΆαα·ααΈααΆααααα½ααααα»ααααα»αααΆαααααααααααααΆαααααααα’ααα αααααααΆααααααααααααα½ααα αα·ααααααααα·ααααααααααΉαααααΌααααααααααααααααα· ααααα·αα αΆαααΆα ααααααΆααα½αααΆα±ααα αααΆααααΆααα
ααα ααααΈααααα·ααααΆα
ααΆαα’αα»αααααααααααΆαααααα·ααααα½αααααααΈ α¬ααΆαααααΆααααααΌααααααααΆαααααααααααααααα·αααααααΆααΆαα½αααΆααΆαααααα’αααα ααΆααααααΆαααααα αα·ααααααΆααΆαααΌααααααααΆααααααααΆααααα α’ααααα·ααΆα αα·ααα·αααααα’αΆα ααΏααΆααααΆαααΆαα·αααααααααααα½αααααΆαααααα·αααααααααα»αααααΆααα»α αα·α αααααααΆααααααααΆα±ααααΆαα αααΆααααΆαα αα·αα αααΆααααΆαα αααα’αα»ααααΆαα±αααα½αααααααΎααΆααααααα α α·αααα’αΆααΈαααααααΆαααααααααΎαα‘αΎαα
αααααΆααα·αααα αααααααΆαααααΆααα·αααααααααααααααααααΆαα’αα»αααααααααααΎα±ααααΆαααα α αααααααΆαα ααΆαααααΆααααααΌααααααααΆααααααααααααααααααα·α αααΆαααΆαα·α ααΆαα·ααα½ααα·ααΆααααα»αααΆααααααααα½αααααα
ααΆαα’αα»αααααααααααααααααααααΆαααααΊ yang αααααΆααα·αααααααααααααΆαααααΊ yin α αα αααααααΎααΆαα½αααααΆ αααααααα·αααααΆαααααααααΎα±ααααΆααααααααΆααααα‘ααααααΆα αα·αααΆααααααααΌααααααΆααΆαααΆαααΆααααα½αααΆααα»αα
ααΎαααααΌααααααα’ααααα»αα αααα Mukul Murthy αα·α Pranav Anand α ααααααΆααα½αα αααααααααα½αααα ααααα’ααααααααα
α’ααααααααααααααα αααα»ααααααΈαααα
α’αααααβαααβααΆαααα
ααααα: www.habr.com