ืืื ืืืจ! ืื ื ืืฆืื ืืชืฉืืืช ืืื ืืช ืืชืจืืื ืฉื ืืืืืจ
ื ืชืื ืื, ืืื ืื ืืกืืื ืฉืื ื, ืืฆืืืจืื ืืืชืคืชืืื ืื ืืืื. ืืื ืืขืืื ืืงืฆื, ืืืืืืื ืืื ืืืืื ืฉืื ื ืฉื ืืขืืื ืืืืืื ืืืกืชืื ืื ืชืื ืื ืืืฉืื, ืฉืืืงื ืืืืืื ืืืืืื ืืืฉืื - ืืจืืื ืืืฉืืช ืืืชืืื ื ืืืืจืื ืฉืื ืืื ืื ื ืืืฉื ืืืืืื ืงืืื ืืื. ืืืืืืื ืืื ืืืืื ืืืื ืืื ื ืฉืื ืื ืืืจืื ืืกืืืืืช ืืืืื ืฉืงืืืขืืช ืืืฆื ืื ื ืืงืืืืื ืืืขืืืื ืืืืข ืืืฉ.
ืื ืืืื ืืืชื ื ืืกืืืืืช ื ืืืื ืืกืืืื. ืืื ืฉืืืชืืจืื ืืืืจืืฉืืช ืืขืกืงืืืช ืืฉืชื ืืช ืขื ืืืื, ืื ืื ืืื ื ืื ืชืื ืื ืฉืื ืืฉืชื ืื. Delta Lake ืืงื ืขื ืืฆืืช ืืืืืืช ืืืฉืืช ืืืฉืจ ืื ืชืื ืื ืืฉืชื ืื. ืืืฉืชืืฉืื ืืฉ ืืืฉื ืืกืื ืืืงื ืคืฉืืื ืืื ืื ืื ืืช ืกืืืืืช ืืืืื ืฉืืื. ืืืืื ืืืื ืืืืืื Schema Enforcement, ืฉืืื ื ืขื ืืืฉืชืืฉืื ืืืืื ืืช ืืืืืืืช ืฉืืื ืืฉืืื ืื ืื ืชืื ืื ืืืืชืจืื, ื- Schema Evolution, ืืืืคืฉืจืช ืืืืกืืฃ ืขืืืืืช ืืืฉืืช ืฉื ื ืชืื ืื ืืงืจื ืขืจื ืืืืคื ืืืืืืื ืืืืงืืืื ืืืชืืืืื. ืืืืืจ ืื, ื ืฆืืื ืขืืืง ืืืชืจ ืืฉืืืืฉ ืืืืื ืืื.
ืืื ืช ืกืืืืืช ืืืื
ืื DataFrame ื- Apache Spark ืืืื ืกืืืื ืืืืืืจื ืืช ืฆืืจืช ืื ืชืื ืื, ืืืื ืกืืื ื ืชืื ืื, ืขืืืืืช ืืืื ื ืชืื ืื. ืขื Delta Lake, ืกืืืืช ืืืืื ืืืืืกื ืช ืืคืืจืื JSON ืืชืื ืืืื ืืขืกืงืืืช.
ืืื ืืืืคืช ืชืื ืืช?
Schema Enforcement, ืืืืืข ืื ืืฉื Schema Validation, ืืื ืื ืื ืื ืืืืื ื-Delta Lake ืืืืืื ืืืืืช ื ืชืื ืื ืขื ืืื ืืืืืช ืจืฉืืืืช ืฉืืื ื ืชืืืืืช ืืกืืืืช ืืืืื. ืืื ืืืืจืืช ืืืืคืง ืืงืืื ืฉื ืืกืขืื ืคืืคืืืจืืช ืืืืื ืืช ืืืื, ืืื ืืืืงืช ืืื ืื ืขืืืืช ื ืชืื ืื ืืืืื ืช ืืืืื ื ืืฆืืช ืืจืฉืืืช ืืขืืืืืช ืืฆืคืืืืช (ืืืืืื ืืืจืืช, ืืื ืืฉ "ืืืื ื" ืืื ืืืช ืืื ). ืืืืื ืื ืจืฉืืื ืขื ืขืืืืืช ืฉืืื ื ืืจืฉืืื.
ืืืฆื ืคืืขืืช ืืืืคืช ืืกืืืื?
Delta Lake ืืฉืชืืฉ ืืืืืงืช schema-on-write, ืืืืืจ ืื ืืืชืืื ืืืืฉื ืืืืื ื ืืืงืช ืืืื ืชืืืืืช ืขื ืกืืืืช ืืืืช ืืืขื ืืืื ืืืชืืื. ืื ืืกืืืื ืืื ื ืขืงืืืช, Delta Lake ืืืื ืืช ืืขืกืงื ืืืืืืื (ืื ื ืืชืืื ื ืชืื ืื) ืืืขืื ืืจืื ืืื ืืืืืืข โโืืืฉืชืืฉ ืขื ืื ืืขืงืืืืช.
Delta Lake ืืฉืชืืฉ ืืืืืื ืืืืื ืืื ืืงืืืข ืื ืจืฉืืื ืชืืืืช ืืืืื. DataFrame ืืืชืืื:
- ืื ืืืื ืืืืื ืขืืืืืช ื ืืกืคืืช ืฉืืื ื ืืกืืืื ืฉื ืืืืช ืืืขื. ืืขืืืช ืืืช, ืืื ืืกืืจ ืื ืื ืชืื ืื ืื ืื ืกืื ืืื ื ืืืืืื ืืืืืืื ืืช ืื ืืขืืืืืช ืืืืืื - ืืขืืืืืช ืืื ืคืฉืื ืืืงืฆื ืขืจืื null.
- ืื ืืืื ืืืืื ืกืืื ื ืชืื ื ืขืืืืืช ืฉืื ืื ืืกืืื ืื ืชืื ืื ืฉื ืืขืืืืืช ืืืืืช ืืืขื. ืื ืขืืืืช ืืืืช ืืืขื ืืืืื ื ืชืื ื StringType, ืื ืืขืืืื ืืืชืืืื ื-DataFrame ืืืืื ื ืชืื ื IntegerType, ืืืืคืช ืืกืืืื ืชืืจืืง ืืจืืื ืืชืื ืข ืืช ืคืขืืืช ืืืชืืื.
- ืื ืืืื ืืืืื ืฉืืืช ืขืืืืืช ืฉืื ืื ืจืง ืืืงืจื. ืืฉืืขืืช ืืืืจ ืืื ืฉืื ื ืืชื ืืืืืืจ ืขืืืืืช ืืฉื 'Fo' ื-'foo' ืืืืชื ืืืื. ืืขืื ืฉื ืืชื ืืืฉืชืืฉ ื-Spark ืืืฆื ืชืืื ืจืืฉืืืช ืื ืื ืชืืื ืจืืฉืืืช (ืืจืืจืช ืืืื), Delta Lake ืฉืืืจ ืขื ืจืืฉืืืช ืื ืืื ื ืจืืืฉ ืืชืื ืืืกืื ืืกืืืื. ืคืจืงื ืืื ืจืืืฉ ืืืืชืืืช ืืืืืืช ืืขืช ืืืกืื ืืืืืจืช ืืืืข ืขืืืื. ืืื ืืื ืืข ืฉืืืืืช ืืคืฉืจืืืช, ืคืืืขื ืื ืชืื ืื ืื ืืืืื ื ืชืื ืื (ืืฉืื ืฉืืืืื ื ืืืืคื ืืืฉื ื-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 ืืืฆืื ืืช ืฉืชื ืืกืืืืช ื-Stack Trace ืืฆืืจื ืืฉืืืื.
ืื ืืืชืจืื ืืืืืคืช ืกืืืื?
ืืืืืื ืฉืืืืคืช ืกืืืื ืืื ืืืืงื ืงืคืื ืืช ืืืื, ืืื ืืื ืืฆืืื ืืฉืืืืฉ ืืฉืืืจ ืกืฃ ืืืขืจื ื ืชืื ืื ื ืงื, ืฉืขืืจ ืืจื ืกืคืืจืืฆืื ืืืื, ืืืื ืืืืฆืืจ ืื ืืฆืจืืื. ืืืืฉื ืืืจื ืืื ืขื ืืืืืืช ืฉืืืื ืืช ื ืชืื ืื ืืฉืืจืืช:
- ืืืืืจืืชืืื ืฉื ืืืืืช ืืืื ื
- ืืืืืช ืืืืื ืื ืฉื BI
- ืืื ื ืืชืื ื ืชืื ืื ืืืืืื
- ืื ืืขืจืืช ืืืฆืืจ ืืืืจืฉืช ืกืืืืช ืกืื ืืืืช ืืืื ืืช ืืืื, ืืืงืืืืช ืืืงืืช.
ืืื ืืืืื ืืช ืื ืชืื ืื ืฉืืื ืืืืฉืื ืืืืจืื ืืื, ืืฉืชืืฉืื ืจืืื ืืฉืชืืฉืื ืืืจืืืืงืืืจืช "ืจื-ืืืค" ืคืฉืืื ืฉืืื ืืกื ืืืืจืื ืืื ื ืืืืืืืช ืฉืืื. ืืื ืืืืื ืขืื ืขื ืื, ืืชื ืืืื ืืขืืื ืืืืืจ
ืืืืื ืฉื ืืชื ืืืฉืชืืฉ ืืืืืคืช ืกืืืื ืืื ืืงืื ืืฆื ืจืช ืฉืื, ืื ืืืจื ืฉืืจืืื ืืืืื ืืืงืจื ืื ืืืืื ืืืืืช ืืชืกืืืช, ืื ืืืฉื ืฉืืืช ืฉืืืกืคืช ืขืืืื ื ืืกืคืช ืื ืชืื ืื ืื ืื ืกืื.
ืื ืืขืช ืืืืื ื ืชืื ืื
ืขื ืขืืฉืื ืืชื ืืืื ืชืืืื, ืขื ืื ืื ืืืืืื? ืืืจื ืืื, ืืคืขืืื ืฉืืืืช "ืื ืืชืืื ืฉื ืกืืืื" ืืืชื ืฆืคืืื ืืืืื ืืืืฉืื ืืืชื ืืืจืืืช ืืขืืืื ืฉืื, ืืืืืื ืื ืืชื ืืืฉ ื-Delta Lake. ืืื ืื ืคืฉืื ืืชืช ืืกืืืื ืืืฉืชื ืืช ืืคื ืืฆืืจื ืืื ืฉืืืื ืืืชืื ืืช ื-DataFrame ืฉืื ืื ืืฉื ื ืื?
ืืคื ืฉืืืืจ ืืคืชืื ืืืฉื, "ืืจื ืฉื ืื ืืขื ืฉืืื ืงืืื ืฉื ืชืจืืคื." ืืฉืื ืืกืืื, ืื ืื ืชืืื ืืืืืฃ ืืช ืืกืืืื ืฉืื, ืืขืืืช ืชืืืืืช ืืกืื ื ืชืื ืื ืืขืื ืืช ืจืืฉื ืืืืืขืจ - ืืงืืจืืช ื ืชืื ืื ืืืืืืื ืืืืืื ืืื ืืืืืจื ืขืฉืืืื ืืืืื ืืงืจื ืงืฆื, ืขืืืืืช ืคืืืืืช, ืืืคืืืื ืฉืืืืื ืื ืืืจืื ืืคืืืืื ืืืจืื ืืืืื ืขืืืื. ืกืืืืื. ืืืืฉื ืืืืื ืืืืชืจ ืืื ืืขืฆืืจ ืืช ืืืืืืื ืืืื ืืฉืขืจ - ืขื ืืืืคืช ืกืืื - ืืืืชืืืื ืืืชื ืืืืจ, ืืื ืืืืืจ ืืืชืจ ืืฉืื ืืชืืืืื ืืืจืื ืืืขืืงืื ืืืคืืื ืฉื ืงืื ืืืืฆืืจ ืฉืื.
ืืืืคืช ืกืืืื ืืขื ืืงื ืื ืืช ืืืืืืื ืฉืืกืืืื ืฉื ืืืืื ืฉืื ืื ืชืฉืชื ื ืืื ืื ืชืืฉืจ ืืช ืืฉืื ืื. ืื ืืื ืข ืืืืื ื ืชืื ืื, ืฉืขืืื ืืืชืจืืฉ ืืืฉืจ ืขืืืืืช ืืืฉืืช ืืชืืืกืคืืช ืืชืืืจืืช ืื ืืืืื ืขื ืฉืืืืืืช ืืืืกืืช ืืขืืืช ืขืจื ืืขืืจ ืืืืืืช ืืช ืืืฉืืขืืช ืืืฉืืืืฉืืืช ืฉืืื ืขืงื ืืฆืคื ืฉื ื ืชืื ืื. ืขื ืืื ืขืืืืื ืืืืืช ืืืืื, ืืืฆืื ืกืื ืืจืืื ืืืืืื ืืืฆืคืืช ืืืืืืช ืืืืื, ืืืืคืช ืืกืืืื ืขืืฉื ืืืืืง ืืช ืื ืฉืืื ืชืืื ื ื ืืขืฉืืช - ืขืืืจืช ืื ืืืืฉืืจ ืืฆืคืื ืืช ืืืืืืื ืืช ืืืืงืืจืื ืืื ืฉืื ื ืงืืื.
ืื ืืฉืืงืื ื ืืกืฃ ืชืืืื ืฉืืชื ืืืืช ืฆืืจื ืืืกืฃ ืขืืืื ืืืฉื - ืืื ืืขืื, ืืืื ืชืืงืื ืืฉืืจื ืืืช. ืืคืชืจืื ืืื ืืชืคืชืืืช ืืืขืื!
ืืื ืืืืืืฆืื ืฉื ืกืืืื?
ืืชืคืชืืืช ืกืืืื ืืื ืชืืื ื ืืืืคืฉืจืช ืืืฉืชืืฉืื ืืฉื ืืช ืืงืืืช ืืช ืกืืืืช ืืืืื ืื ืืืืืช ืืืชืื ืื ืชืื ืื ืืืฉืชื ืื ืขื ืืืื. ืืื ืืฉืืฉ ืืจืื ืืขืช ืืืฆืืข ืคืขืืืช ืืืกืคื ืื ืืชืืื ืืืืฉ ืืื ืืืชืืื ืืืืืืืืช ืืช ืืกืืืื ืื ืฉืชืืืื ืขืืืื ืืืฉื ืืืช ืื ืืืชืจ.
ืืื ืขืืืืช ืืชืคืชืืืช ืืกืืืื?
ืืขืงืืืช ืืืืืื ืืืกืขืืฃ ืืงืืื, ืืคืชืืื ืืืืืื ืืืฉืชืืฉ ืืงืืืช ืืคืืชืื ืกืืืื ืืื ืืืืกืืฃ ืขืืืืืช ืืืฉืืช ืฉื ืืื ืืขืืจ ืขืงื ืืืกืจ ืขืงืืืืช ืืกืืืื. ืืชืคืชืืืช ืืืขืื ืืืคืขืืช ืขื ืืื ืืืกืคื .option('mergeSchema', 'true')
ืืฆืืืช ืืกืคืืจืง ืฉืื .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(data) ืืฆืืจื ืืืืืชื ืืืืฉ. ืฉืื ืืืื ืืืื ืืืืืื:
- ืืืืงืช ืขืืืื
- ืฉืื ืื ืกืื ืื ืชืื ืื ืฉื ืขืืืื ืงืืืืช (ืืืงืื)
- ืฉืื ืื ืฉืืืช ืฉื ืขืืืืืช ืฉื ืืืืืช ืจืง ืืืงืจื (ืืืืืื, "Foo" ื-"foo")
ืืืกืืฃ, ืขื ืืืืืืจื ืืืื ืฉื Spark 3.0, DDL ืืคืืจืฉ ืืงืื ืชืืืื ืืืื (ืืืืฆืขืืช ALTER TABLE), ืืืืคืฉืจ ืืืฉืชืืฉืื ืืืฆืข ืืช ืืคืขืืืืช ืืืืืช ืืกืืืืืช ืืืื:
- ืืืกืคืช ืขืืืืืช
- ืฉืื ืื ืืขืจืืช ืขืืืืืช
- ืืืืจืช ืืืคืืื ื ืืืื ืืฉืืืืื ืืืชื ืืืืช ืืืืื, ืืืื ืืืืจืช ืืฉื ืืืื ืฉืื ืืืื ืืจื ืืงืฆืืืช ืืืืืกื.
ืื ืืืชืจืื ืฉื ืืืืืืฆืื ืืืขืื?
ื ืืชื ืืืฉืชืืฉ ืืืชืคืชืืืช ืกืืืื ืืื ืคืขื ืฉืืชื ืืชืืืื ืฉื ื ืืช ืืกืืืื ืฉื ืืืืื ืฉืื (ืื ืืืื ืืืงืจื ืฉืืืกืคืช ืืืขืืช ืขืืืืืช ื-DataFrame ืฉืื โโืฉืื ืืืืจืืช ืืืืืช ืฉื). ืืืื ืืืจื ืืงืื ืืืืชืจ ืืืขืืืจ ืืช ืืกืืืื ืฉืื ืืืืืื ืฉืืื ืืืกืืคื ืืืืืืืืช ืืช ืฉืืืช ืืขืืืืืช ืืกืืื ืื ืชืื ืื ืื ืืื ืื ืืืื ืืืืจืื ืขืืืื ืืืคืืจืฉ.
ืืกืงื ื
ืืืืคืช ืกืืืื ืืืื ืื ืขืืืื ืืืฉื ืื ืฉืื ืืื ืกืืืื ืืืจืื ืฉืืื ื ืชืืืืื ืืืืื ืฉืื. ืขื ืืื ืงืืืขืช ืืชืืืืงื ืฉื ืกืื ืืจืืื ืืืืืื ืืื, ืื ืืืกืืื ืืืื ืืกืื ืืืืืื ืืกืืื ืขื ืื ืฉืื ืชืื ืื ืฉืืื ืืฉ ืืช ืจืืช ืืืื ืืืจืืื ืืืืืื ืืืืชืจ, ืืชืงืฉืจืื ืืืชื ืืฆืืจื ืืจืืจื ืืืจืืจื, ืืืืคืฉืจืื ืืื ืืงืื ืืืืืืช ืขืกืงืืืช ืืืืืช ืืืชืจ.
ืืฆื ืฉื ื, ืืชืคืชืืืช ืืกืืืื ืืฉืืืื ืืช ืืืืืคื ืขื ืืื ืคืืฉืื ืืืืจ ืฉืื ืืืื ืืืืืืืืื ืืกืืืื. ืืืจื ืืื, ืื ืื ืืืืจ ืืืืืช ืงืฉื ืืืืกืืฃ ืขืืืื.
ืืืืฉืื ืืืคืื ืฉื ืืกืืืื ืืื ืืื ื, ืืืฉืจ ืืืืืืืฆืื ืฉื ืืกืืืื ืืื ืืื. ืืฉืืืืฉ ืืื, ืชืืื ืืช ืืื ืืืคืืืช ืืช ืืืืื ืืจืขืฉืื ืืืืื ืื ืืืืชืืช ืืงืืื ืืื ืคืขื.
ืืจืฆืื ื ื ืื ืืืืืืช ืืืืงืื ืืจืชื ืืคืจืื ื ืื ืื ื ืขื ืชืจืืืชื ืืืืืจ ืื.
ืืืืจืื ื ืืกืคืื ืืกืืจื ืื:
ืืืืจืื ืงืฉืืจืื
ืืงืืจ: www.habr.com