ํค์ด ํ๋ธ๋ฅด! ๋๋ ๊ธฐ์ฌ์ ๋ฒ์ญ์ ๋น์ ์ ๊ด์ฌ์ ์ ์ํฉ๋๋ค Burak Yavuz, Brenner Heintz ๋ฐ Denny Lee๊ฐ ์ฝ์ค ์ถ์๋ฅผ ์์ํ์ฌ ์ค๋นํ ๊ฒ์ ๋๋ค. ์คํฌ์ค์์.

๋ฐ์ดํฐ๋ ์ฐ๋ฆฌ์ ๊ฒฝํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋์์์ด ์ถ์ ๋๊ณ ์งํํฉ๋๋ค. ์ด์ ๋ฐ๋ง์ถ๊ธฐ ์ํด, ์ธ์์ ๋ํ ์ฐ๋ฆฌ์ ์ ์ ๋ชจ๋ธ์ ์๋ก์ด ๋ฐ์ดํฐ์ ์ ์ํด์ผ ํ๋ฉฐ, ๊ทธ ์ค ์ผ๋ถ์๋ ์๋ก์ด ์ฐจ์, ์ฆ ์ด์ ์๋ ์ ํ ๋ชฐ๋๋ ์ฌ๋ฌผ์ ๊ด์ฐฐํ๋ ์๋ก์ด ๋ฐฉ์์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฌํ ์ ์ ๋ชจ๋ธ์ ์๋ก์ด ์ ๋ณด๋ฅผ ๋ถ๋ฅํ๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ์คํ๋ ๋์ํธ ์คํค๋ง์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ํ๋ก ๊ด๋ฆฌ ๋ฌธ์ ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ๋ฉ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋น์ฆ๋์ค ๋ชฉํ์ ์๊ตฌ ์ฌํญ์ด ๋ฐ๋๋ฉด ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ๋ฐ๋๊ฒ ๋ฉ๋๋ค. Delta Lake๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋จ์ ๋ฐ๋ผ ์๋ก์ด ์ฐจ์์ ์ฝ๊ฒ ๋์ ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๋ ๊ฐ๋จํ ์๋ฏธ ์ฒด๊ณ์ ์ ๊ทผํ์ฌ ํ ์ด๋ธ ์คํค๋ง๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ์๋ ์ฌ์ฉ์๊ฐ ์ค์๋ก ์ค๋ฅ๋ ๋ถํ์ํ ๋ฐ์ดํฐ๋ก ํ ์ด๋ธ์ ์ด์ง๋ฝํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์คํค๋ง ์ ์ฉ๊ณผ, ์ ์ ํ ์์น์ ๊ท์คํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ์ ์ด์ ์๋์ผ๋ก ์ถ๊ฐํ ์ ์๋ ์คํค๋ง ์งํ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ด ๊ธ์์๋ ์ด๋ฌํ ๋๊ตฌ์ ์ฌ์ฉ๋ฒ์ ๋ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
ํ ์ด๋ธ ์คํค๋ง ์ดํด
Apache Spark์ ๊ฐ DataFrame์๋ ๋ฐ์ดํฐ ์ ํ, ์ด, ๋ฉํ๋ฐ์ดํฐ ๋ฑ ๋ฐ์ดํฐ์ ํํ๋ฅผ ์ ์ํ๋ ์คํค๋ง๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. Delta Lake๋ฅผ ์ฌ์ฉํ๋ฉด ํ
์ด๋ธ ์คํค๋ง๊ฐ ํธ๋์ญ์
๋ก๊ทธ ๋ด๋ถ์ JSON ํ์์ผ๋ก ์ ์ฅ๋ฉ๋๋ค.
๊ณํ ์งํ์ด๋ ๋ฌด์์ธ๊ฐ์?
์คํค๋ง ์ ์ฉ(Schema Enforcement)์ ์คํค๋ง ๊ฒ์ฆ(Schema Validation)์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ํ ์ด๋ธ ์คํค๋ง์ ๋ง์ง ์๋ ๋ ์ฝ๋๋ฅผ ๊ฑฐ๋ถํ์ฌ ๋ฐ์ดํฐ ํ์ง์ ๋ณด์ฅํ๋ Delta Lake์ ๋ณด์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์์ฝ๋ง ๋ฐ๋ ์ ๋ช ๋ ์คํ ๋์ ํ๋ฐํธ ๋ฐ์คํฌ ์ง์์ฒ๋ผ, ๊ทธ๋ ๋ ํ ์ด๋ธ์ ์ ๋ ฅ๋ ๊ฐ ๋ฐ์ดํฐ ์ด์ด ํด๋น ์์ ์ด ๋ชฉ๋ก์ ์๋์ง(์ฆ, ๊ฐ ์ด์ "์์ฝ"์ด ์๋์ง) ํ์ธํ๊ณ ๋ชฉ๋ก์ ์๋ ์ด์ด ์๋ ํญ๋ชฉ์ ๋ชจ๋ ๊ฑฐ๋ถํฉ๋๋ค.
์คํค๋ง ์ ์ฉ์ ์ด๋ป๊ฒ ์๋ํ๋์?
Delta Lake๋ ์ฐ๊ธฐ ์ ์คํค๋ง ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ํ
์ด๋ธ์ ๋ํ ๋ชจ๋ ์๋ก์ด ์ฐ๊ธฐ๋ ์ฐ๊ธฐ ์์ ์ ๋์ ํ
์ด๋ธ์ ์คํค๋ง์์ ํธํ์ฑ์ ๊ฒ์ฌํฉ๋๋ค. ์คํค๋ง๊ฐ ์ผ๊ด๋์ง ์์ผ๋ฉด Delta Lake๋ ํธ๋์ญ์
์ ์์ ํ ๋กค๋ฐฑํ๊ณ (๋ฐ์ดํฐ๊ฐ ๊ธฐ๋ก๋์ง ์์) ์ฌ์ฉ์์๊ฒ ๋ถ์ผ์น๋ฅผ ์๋ฆฌ๊ธฐ ์ํด ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.
Delta Lake๋ ๋ค์ ๊ท์น์ ์ฌ์ฉํ์ฌ ๋ ์ฝ๋๊ฐ ํ
์ด๋ธ๊ณผ ํธํ๋๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค. DataFrame ์์ฑ ์ค:
- ๋์ ํ ์ด๋ธ ์คํค๋ง์ ์๋ ์ถ๊ฐ ์ด์ ํฌํจํ ์ ์์ต๋๋ค. ๋ฐ๋๋ก, ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ํ ์ด๋ธ์ ๋ชจ๋ ์ด์ด ํฌํจ๋์ด ์์ง ์์๋ ๊ด์ฐฎ์ต๋๋ค. ํด๋น ์ด์๋ ๋จ์ํ null ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
- ๋์ ํ ์ด๋ธ์ ์ด ๋ฐ์ดํฐ ์ ํ๊ณผ ๋ค๋ฅธ ์ด ๋ฐ์ดํฐ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๋์ ํ ์ด๋ธ์ ์ด์ StringType ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ง๋ง DataFrame์ ํด๋น ์ด์ IntegerType ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ์คํค๋ง ์ ์ฉ์ ์์ธ๋ฅผ ๋ฐ์์ํค๊ณ ์ฐ๊ธฐ ์์ ์ด ๋ฐ์ํ์ง ์๋๋ก ํฉ๋๋ค.
- ๋์๋ฌธ์๋ง ๋ค๋ฅธ ์ด ์ด๋ฆ์ ํฌํจํ ์ ์์ต๋๋ค. ์ฆ, ๊ฐ์ ํ ์ด๋ธ์ 'Foo'์ 'foo'๋ผ๋ ์ด๋ฆ์ ์ด์ ์ ์ํ ์ ์์ต๋๋ค. Spark๋ ๋์๋ฌธ์ ๊ตฌ๋ถ ๋๋ ๋์๋ฌธ์ ๊ตฌ๋ถ ์ ํจ(๊ธฐ๋ณธ๊ฐ) ๋ชจ๋๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐ๋ฉด, Delta Lake๋ ๋์๋ฌธ์๋ฅผ ๋ณด์กดํ์ง๋ง ์คํค๋ง ์ ์ฅ์ ๋ด์์๋ ๋์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์ต๋๋ค. 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 ๋์๋ณด๋
- ๋ฐ์ดํฐ ๋ถ์ ๋ฐ ์๊ฐํ ๋๊ตฌ
- ์๊ฒฉํ๊ฒ ๊ตฌ์กฐํ๋๊ณ , ์๊ฒฉํ๊ฒ ์ ํํ๋ ์๋ฏธ ์ฒด๊ณ๋ฅผ ํ์๋ก ํ๋ ๋ชจ๋ ์์ฐ ์์คํ ์ ๋๋ค.
์ด ๋ง์ง๋ง ์ฅ์ ๋ฌผ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๋ง์ ์ฌ์ฉ์๋ ์ ์ง์ ์ผ๋ก ํ ์ด๋ธ์ ๊ตฌ์กฐ๋ฅผ ๋์ ํ๋ ๊ฐ๋จํ "๋ฉํฐํ" ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํฉ๋๋ค. ์ด์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด ๊ธฐ์ฌ๋ฅผ ์ฝ์ด๋ณด์ธ์.
๋ฌผ๋ก , ํ์ดํ๋ผ์ธ์ ์ด๋ ๊ณณ์์๋ ์คํค๋ง ์ ์ฉ์ ์ฌ์ฉํ ์ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ํ ์ด๋ธ์ ์ฐ๋ ๊ฒ์ ์ง์ฆ์ค๋ฌ์ธ ์ ์๋ค๋ ์ ์ ๊ธฐ์ตํ์ธ์. ์๋ฅผ ๋ค์ด, ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ๋ค๋ฅธ ์ด์ ์ถ๊ฐํ๋ค๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ์ดํฐ ์กํ ๋ฐฉ์ง
์ด์ฏค ๋๋ฉด ์ฌ๋ฌ๋ถ์ ์ด ๋ชจ๋ ์๋์ด ๋ฌด์์ธ์ง ๊ถ๊ธํ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ตญ, ์์์น ๋ชปํ "์คํค๋ง ๋ถ์ผ์น" ์ค๋ฅ๊ฐ ์์ ํ๋ฆ์ ๊ฑธ๋ฆผ๋์ด ๋ ์ ์์ต๋๋ค. ํนํ Delta Lake๋ฅผ ์ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ์ ํ์์ ๋ฐ๋ผ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํด์ ๋ฌด์จ ์ผ์ด ์์ด๋ DataFrame์ ์ธ ์ ์๊ฒ ํ์ง ์๋์?
์๋ง์ "์๋ฐฉ์ ์น๋ฃ๋ณด๋ค ์ค์ํ๋ค"๋ผ๋ ๋ง์ด ์์ต๋๋ค. ์ด๋ ์์ ์์ ์คํค๋ง๋ฅผ ์ ์ฉํ๋ ๋ฐ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ง ์์ผ๋ฉด ๋ฐ์ดํฐ ์ ํ ํธํ์ฑ ๋ฌธ์ ๊ฐ ์ฌ๊ฐํ ๋ฌธ์ ๋ก ๋ํ๋ ๊ฒ์ ๋๋ค. ๊ฒ๋ณด๊ธฐ์ ๋์ง์ ์ธ ์์ ๋ฐ์ดํฐ ์์ค์๋ ์์ธ์ ์ธ ์ํฉ, ์์๋ ์ด, ์๋ชป๋ ๋งคํ ๋๋ ์ ๋ชฝ์ด ํ์ค์ด ๋๋ ๋ฌด์์ด ๋ฌธ์ ๊ฐ ํฌํจ๋ ์ ์์ต๋๋ค. ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์คํค๋ง ์ ์ฉ์ ํตํด ์ด๋ฌํ ์ ์ ๊ฒ์ดํธ์์ ๋ง๊ณ , ๋์ค์ ํ๋ก๋์ ์ฝ๋์ ์ด๋์ด ๊น์ํ ๊ณณ์ ์จ์ด๋ค๊ธฐ ์์ํ ๋ ์ฒ๋ฆฌํ๋ ๊ฒ๋ณด๋ค๋, ๋จผ์ ๋ฐ์ ๊ณณ์์ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
์คํค๋ง๋ฅผ ์ ์ฉํ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ์์ ์ผ๋ก ์ปค๋ฐํ์ง ์๋ ํ ํ ์ด๋ธ์ ์คํค๋ง๊ฐ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด ์ด์ด ๋๋ฌด ์์ฃผ ์ถ๊ฐ๋์ด ์ด์ ์๋ ๊ท์คํ๊ณ ์์ถ๋ ํ ์ด๋ธ์ด ๋ฐ์ดํฐ ํ์๋ก ์ธํด ์๋ฏธ์ ์ ์ฉ์ฑ์ ์์ด๋ฒ๋ฆฌ๋ ๋ฐ์ดํฐ ํฌ์์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์คํค๋ง ๊ฐํ๋ ์๋์ ์ธ ํ๋๋ฅผ ๊ฐ๊ณ , ๋์ ๊ธฐ์ค์ ์ค์ ํ๊ณ , ๋์ ํ์ง์ ๊ธฐ๋ํ๋๋ก ์ฅ๋ คํจ์ผ๋ก์จ ๋ณธ๋ ์๋ํ ๋๋ก ์๋ํฉ๋๋ค. ์ฆ, ์ฑ์คํจ์ ์ ์งํ๊ณ ์คํ๋ ๋์ํธ๋ฅผ ๊น๋ํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋ ์์ธํ ๊ณ ๋ คํ ํ ์ค์ ๋ก ๊ทธ๋ ๊ฒ ํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค๋ฉด ํ์ํ ์๋ก์ด ์ด์ ์ถ๊ฐํ์ธ์. ๋ฌธ์ ์์ต๋๋ค. ์๋์ ํ ์ค๋ก ํด๊ฒฐํ ์ ์๋ ๋ด์ฉ์ด ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ ๊ณํ์ ๋ฐ์ ์ํค๋ ๊ฒ์ ๋๋ค!
์คํค๋ง ์งํ๋ ๋ฌด์์ธ๊ฐ?
์คํค๋ง ์งํ๋ ์ฌ์ฉ์๊ฐ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋๋ ๋ฐ์ดํฐ๋ฅผ ์์ฉํ๊ธฐ ์ํด ํ ์ด๋ธ์ ํ์ฌ ์คํค๋ง๋ฅผ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ด๋ ์คํค๋ง๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ์ฌ ํ๋ ์ด์์ ์ ์ด์ ํฌํจํ๋ ์ถ๊ฐ ๋๋ ๋ค์ ์ฐ๊ธฐ ์์ ์ ์ํํ ๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
์คํค๋ง ์งํ๋ ์ด๋ป๊ฒ ์๋ํ๋์?
์ด์ ์น์
์ ์๋ฅผ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ ์คํค๋ง ์งํ๋ฅผ ์ฌ์ฉํ์ฌ ์ด์ ์ ์คํค๋ง ๋ถ์ผ์น๋ก ์ธํด ๊ฑฐ๋ถ๋์๋ ์๋ก์ด ์ด์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด ๊ณํ์ ์งํ๋ ๋ค์์ ์ถ๊ฐํ์ฌ ํ์ฑํ๋ฉ๋๋ค. .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 ๊ตฌ์ฑ์. ํ์ง๋ง ์คํค๋ง ์ ์ฉ์ด ์๋์น ์์ ์คํค๋ง ๋ถ์ผ์น์ ๋ํด ๋ ์ด์ ๊ฒฝ๊ณ ํ์ง ์์ผ๋ฏ๋ก ์ฃผ์ํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์์ฒญ์ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํจ์ผ๋ก์จ mergeSchemaDataFrame์๋ ์์ง๋ง ๋์ ํ
์ด๋ธ์๋ ์๋ ๋ชจ๋ ์ด์ ์ฐ๊ธฐ ํธ๋์ญ์
์ ์ผ๋ถ๋ก ์คํค๋ง์ ๋์ ์๋์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. ์ค์ฒฉ๋ ํ๋๋ ์ถ๊ฐํ ์ ์์ผ๋ฉฐ, ํด๋น ๊ตฌ์กฐ ์ด์ ๋์ ์ถ๊ฐ๋ฉ๋๋ค.
๋ฐ์ดํฐ ์์ง๋์ด์ ๊ณผํ์๋ ์ด ์ต์ ์ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ชจ๋ธ์ ์์์ํค์ง ์๊ณ ๊ธฐ์กด ๋จธ์ ๋ฌ๋ ํ๋ก๋์ ํ ์ด๋ธ์ ์๋ก์ด ์ด(์ต๊ทผ ์ถ์ ํ ์งํ๋ ์ด๋ฒ ๋ฌ์ ํ๋งค ์์น ์ด ๋ฑ)์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ค์ ์ ํ์ ์คํค๋ง ๋ณ๊ฒฝ์ ํ ์ด๋ธ ์ถ๊ฐ ๋๋ ์ฌ์์ฑ ์ค ์คํค๋ง ์งํ์ ์ผ๋ถ๋ก ํ์ฉ๋ฉ๋๋ค.
- ์ ์ด ์ถ๊ฐ(๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค)
- NullType์์ ๋ค๋ฅธ ์ ํ์ผ๋ก ๋ฐ์ดํฐ ์ ํ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ByteType์์ ShortType์์ IntegerType์ผ๋ก ์น๊ฒฉํฉ๋๋ค.
์คํค๋ง ์งํ ๋ด์์ ํ์ฉ๋์ง ์๋ ๊ธฐํ ๋ณ๊ฒฝ ์ฌํญ์ ์คํค๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ ๋ฎ์ด์จ์ผ ํฉ๋๋ค. .option("overwriteSchema", "true"). ์๋ฅผ ๋ค์ด, "Foo" ์ด์ด ์๋ ์ ์์ด๊ณ ์ ์คํค๋ง๊ฐ ๋ฌธ์์ด ๋ฐ์ดํฐ ์ ํ์ธ ๊ฒฝ์ฐ ๋ชจ๋ Parquet(๋ฐ์ดํฐ) ํ์ผ์ ๋ฎ์ด์จ์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ด ์ญ์
- ๊ธฐ์กด ์ด์ ๋ฐ์ดํฐ ์ ํ์ ๋ณ๊ฒฝํฉ๋๋ค(๊ทธ๋๋ก)
- ๋์๋ฌธ์๋ง ๋ค๋ฅธ ์ด ์ด๋ฆ ๋ฐ๊พธ๊ธฐ(์: "Foo" ๋ฐ "foo")
๋ง์ง๋ง์ผ๋ก, Spark 3.0์ ๋ค์ ๋ฆด๋ฆฌ์ค์์๋ ๋ช ์์ DDL(ALTER TABLE ์ฌ์ฉ)์ด ์๋ฒฝํ๊ฒ ์ง์๋์ด ์ฌ์ฉ์๊ฐ ํ ์ด๋ธ ์คํค๋ง์์ ๋ค์ ์์ ์ ์ํํ ์ ์๊ฒ ๋ฉ๋๋ค.
- ์ด ์ถ๊ฐ
- ์ด ์ฃผ์ ๋ณ๊ฒฝ
- ํธ๋์ญ์ ๋ก๊ทธ๊ฐ ๋ณด๊ด๋๋ ๊ธฐ๊ฐ์ ์ค์ ํ๋ ๋ฑ ํ ์ด๋ธ์ ๋์์ ๊ฒฐ์ ํ๋ ํ ์ด๋ธ ์์ฑ์ ์ค์ ํฉ๋๋ค.
์คํค๋ง ์งํ์ ์ด์ ์ ๋ฌด์์ ๋๊น?
์คํค๋ง ์งํ๋ ์ธ์ ๋ ์ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ํ๋ค ํ ์ด๋ธ์ ์คํค๋ง๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค(์ค์๋ก DataFrame์ ์์ด์๋ ์ ๋ ์ด์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ์๋ ๋์กฐ์ ์ ๋๋ค). ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉ์๊ฐ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ง ์๊ณ ๋ ์ฌ๋ฐ๋ฅธ ์ด ์ด๋ฆ๊ณผ ๋ฐ์ดํฐ ์ ํ์ ์๋์ผ๋ก ์ถ๊ฐํ๋ฏ๋ก ์คํค๋ง๋ฅผ ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
๊ฒฐ๋ก
์คํค๋ง ์ ์ฉ์ ํ ์ด๋ธ๊ณผ ํธํ๋์ง ์๋ ์๋ก์ด ์ด์ด๋ ๊ธฐํ ์คํค๋ง ๋ณ๊ฒฝ ์ฌํญ์ ๊ฑฐ๋ถํฉ๋๋ค. ์ด๋ฌํ ๋์ ๊ธฐ์ค์ ์ค์ ํ๊ณ ์ ์งํจ์ผ๋ก์จ ๋ถ์๊ฐ์ ์์ง๋์ด๋ ์์ ์ ๋ฐ์ดํฐ๊ฐ ์ต๊ณ ์์ค์ ๋ฌด๊ฒฐ์ฑ์ ๊ฐ์ถ๊ณ ์๋ค๋ ๊ฒ์ ๋ฏฟ์ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ช ํํ๊ณ ์ ํํ๊ฒ ์ถ๋ก ํ์ฌ ๋ ๋์ ๋น์ฆ๋์ค ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค.
๋ฐ๋ฉด, ์ด ์ ๋์ ๋ฐ์ ์ ์งํ์ ๋จ์ํํจ์ผ๋ก์จ ์ด๋ฅผ ๋ณด์ํ๋ค. ๊ฐ์ ์ ์๋ ์คํค๋ง ๋ณ๊ฒฝ. ๊ฒฐ๊ตญ, ์ด์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์์ ๊ฒ์ ๋๋ค.
๊ณํ์ ๊ฐ์ ๋ก ์ ์ฉํ๋ ๊ฒ์ ์์ด๋ฉฐ, ๊ณํ์ ์ ๊ฐ๋ ์์ ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ํจ๊ป ์ฌ์ฉํ๋ฉด ์์ ์ต์ ๋ฐ ์ ํธ ์กฐ์ ์ด ๊ทธ ์ด๋ ๋๋ณด๋ค ์ฌ์์ง๋๋ค.
๋ํ ์ด ๊ธฐ์ฌ์ ๊ธฐ์ฌํด ์ฃผ์ Mukul Murthy์ Pranav Anand์๊ฒ๋ ๊ฐ์ฌ๋๋ฆฌ๊ณ ์ถ์ต๋๋ค.
์ด ์๋ฆฌ์ฆ์ ๋ค๋ฅธ ๊ธฐ์ฌ:

๊ด๋ จ ๊ธฐ์ฌ
์ถ์ฒ : habr.com
