๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Apache Spark

[PySpark] Spark์˜ Dataframe API๋ฅผ ์•Œ์•„๋ณด์ž!(1)

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์ŠคํŒŒํฌ ์™„๋ฒฝ ๊ฐ€์ด๋“œ ์ฑ…๊ณผ ์ธํ”„๋Ÿฐ์˜ ์ŠคํŒŒํฌ ๋จธ์‹ ๋Ÿฌ๋‹ ์™„๋ฒฝ ๊ฐ€์ด๋“œ ๊ฐ•์˜๋กœ ๊ณต๋ถ€ํ•œ ํ›„ ๋ฐฐ์šด ๋‚ด์šฉ์„ ์ €๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ์žฌ๊ตฌ์„ฑํ•œ ๊ฒƒ์ž„์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ฐธ๊ณ ํ•œ ์ธํ”„๋Ÿฐ ๊ฐ•์˜์˜ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์Œ์„ ํ•„ํžˆ ์•Œ๋ฆฝ๋‹ˆ๋‹ค!

Apache Spark๋ฅผ Python์œผ๋กœ ์ด์šฉํ•˜๋Š” PySpark์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž


์˜ˆ์ „์— ์•„ํŒŒ์น˜ ์ŠคํŒŒํฌ์— ๋Œ€ํ•œ ๊ฐœ๋…๊ธ€๊ณผ PySpark๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ ์œ ํ˜•์— ๋งž๊ฒŒ ๊ฐ„๋‹จํ•œ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํŠœํ† ๋ฆฌ์–ผ ํ˜•์‹์œผ๋กœ ๋ฐฐ์› ์—ˆ๋‹ค. ๊ทธ ์ดํ›„ ์–ด๋Š ์ •๋„ ์‹œ๊ฐ„์ด ์ง€๋‚œ ํ›„, ์•„ํŒŒ์น˜ ์ŠคํŒŒํฌ์˜ ๋ฒ„์ „๋„ ๋งŽ์ด ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๊ณ  ๊ฐœ์ธ์ ์œผ๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์—ญ๋Ÿ‰์„ ํ‚ค์›Œ๋ณด๊ณ ์ž ์ฑ…๊ณผ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด PySpark๋ฅผ ๋‹ค์‹œ ๋ฐฐ์šฐ๊ณ  ์žˆ๋‹ค.

 

ํ•„์ž๋Š” PySpark๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ชฉ์ ์ด ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ•˜๊ณ  ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›Œ๋ณด๋Š” ๊ฒƒ์ž„์„ ์•Œ๋ฆฐ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ ์ฒซ ํฌ์ŠคํŒ…์—์„œ ์•Œ์•„๋ณผ PySpark API๋Š” ๋ฐ”๋กœ DataFrame API์ด๋‹ค. Spark์˜ DataFrame API๋Š” ํŒ๋‹ค์Šค DataFrame๊ณผ ๋น„์Šทํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํ™•์—ฐํžˆ ์ฐจ์ด์ ์€ ์กด์žฌํ•˜๋Š” API์ด๋‹ค. ๋งˆ์น˜ "SQL ํƒˆ์„ ์“ด DataFrame" ์ด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋Œ€ํ‘œ์ ์ธ ๋ฒค์น˜๋งˆํฌ ๋ฐ์ดํ„ฐ์ธ ํƒ€์ดํƒ€๋‹‰ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ŠคํŒŒํฌ์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์ฐธ๊ณ ๋กœ ์•ž์œผ๋กœ ์‚ฌ์šฉํ•  PySpark ๋ฒ„์ „์€ 3.2.0 ์ด๋ฉฐ Jupyter Notebook์—์„œ PySpark๋ฅผ ์‹ค์Šตํ•˜์˜€๋‹ค.

1. ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ

๋ฐ์ดํ„ฐ๊ฐ€ ํ˜„์žฌ ๋กœ์ปฌ์—์„œ csv ๋ฐ์ดํ„ฐ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Spark์˜ read.csv ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

path = '/Users/younghun/Desktop/gitrepo/data/titanic/train.csv'

spark_df = spark.read.csv(path, header=True, inferSchema=True)
spark.show()

 

show() ๋ฉ”์†Œ๋“œ ๊ฒฐ๊ณผ

 

์œ„ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด show() ๋ฉ”์†Œ๋“œ๋Š” ๋กœ๋“œํ•œ ์ŠคํŒŒํฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์ƒ์œ„ 20๊ฐœ Row๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  show() ๋ฉ”์†Œ๋“œ ์ธ์ž์— $n$(์ˆซ์ž)๋ฅผ ๋„ฃ์–ด์ฃผ์–ด ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๋งŒํผ ์ƒ์œ„ $n$๊ฐœ์˜ Row๋ฅผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  show() ๋ฉ”์†Œ๋“œ ์•ž์—๋‹ค๊ฐ€ limit() ์ด๋ผ๋Š” ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์ƒ์œ„ Row ๊ฐœ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ๋‹ค. limit() ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋Š” num ์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

path = '/Users/younghun/Desktop/gitrepo/data/titanic/train.csv'

spark_df = spark.read.csv(path, header=True, inferSchema=True)
spark_df.limit(num=5).show()

 

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ™์œผ๋กœ ํŒ๋‹ค์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ head() ๋ฉ”์†Œ๋“œ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜์ง€๋งŒ head() ๋ฉ”์†Œ๋“œ๋Š” ํŒ๋‹ค์Šค ๋•Œ์™€ ๋‹ฌ๋ฆฌ ์ŠคํŒŒํฌ์—์„œ๋Š” Row ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋งŒ์•ฝ head() ๋ฉ”์†Œ๋“œ์— ์•„๋ฌด๋Ÿฐ ์ธ์ž๋„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ€์žฅ ์ƒ์œ„์˜ Row ๊ฐ์ฒด 1๊ฐœ๋งŒ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

path = '/Users/younghun/Desktop/gitrepo/data/titanic/train.csv'
spark_df = spark.read.csv(path, header=True, inferSchema=True)
spark_df.head()

 

head() ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์‹œ ๋ฐ˜ํ™˜๋˜๋Š” Row ๊ฐ์ฒด 1๊ฐœ

 

ํŠน์ดํ•œ ์ ์€ ์Šคํ‚ค๋งˆ(์นผ๋Ÿผ ์ด๋ฆ„)์™€ ๊ฐ’ ๋ชจ๋‘ ๋ฐ˜ํ™˜๋œ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ Row ๊ฐ์ฒด๋ฅผ ํŒŒ์ด์ฌ์˜ ๋„ค์ž„๋“œ ํŠœํ”Œ์ฒ˜๋Ÿผ Key ๊ฐ’์„ ์ฐธ์กฐํ•˜์—ฌ ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” Value ๊ฐ’์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

path = '/Users/younghun/Desktop/gitrepo/data/titanic/train.csv'

spark_df = spark.read.csv(path, header=True, inferSchema=True)
row = spark_df.head()

print(row)
print()
print('row์˜ PassengerId:', row['PassengerId'], row.PassengerId)

 

๊ทธ๋ฆฌ๊ณ  ๋˜ ํŠน์ดํ•œ ์ ์€ head() ๋ฉ”์†Œ๋“œ ์ธ์ž์— 1์„ ํฌํ•จํ•œ ์ฆ‰, ์ˆซ์ž๋ฅผ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋ฐ˜๋“œ์‹œ ๋ฐ˜ํ™˜์€ Row ๊ฐ์ฒด(๋“ค)๊ฐ€ ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋ง์ด๋‹ค.

 

path = '/Users/younghun/Desktop/gitrepo/data/titanic/train.csv'
spark_df = spark.read.csv(path, header=True, inferSchema=True)

# 1. head()์— ์ธ์ž๋กœ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์ค„ ๋•Œ
row = spark_df.head()
print('row:', row)
print()
# 2. head()์— ์ธ์ž๋กœ 1์„ ์ค„ ๋•Œ
row2 = spark_df.head(1)
print('row2:', row2)
print()
# 3. head()์— ์ธ์ž๋กœ 3์„ ์ค„ ๋•Œ
row3 = spark_df.head(3)
print('row3:', row3)

 

head() ๋ฉ”์†Œ๋“œ ์ธ์ž์— ์ˆซ์ž๋ฅผ ๋„ฃ๊ณ  ์•ˆ๋„ฃ๊ณ ์˜ ์ฐจ์ด์ 

2. ๋ฐ์ดํ„ฐ ๋ช…์„ธ์„œ ์‚ดํŽด๋ณด๊ธฐ

๋‹ค์Œ์€ PySpark๋กœ ๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ช…์„ธ์„œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์ด๋‹ค. ๋ช…์„ธ์„œ๋ž€, ๋ฐ์ดํ„ฐ์— ์–ด๋–ค ์นผ๋Ÿผ์ด ์žˆ๊ณ  ๊ทธ ์นผ๋Ÿผ ๊ฐ’์˜ ํƒ€์ž…์€ ๋ฌด์—‡์ธ์ง€์— ๋Œ€ํ•ด ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํŒ๋‹ค์Šค๋กœ ์น˜๋ฉด dataframe.info() ๋˜๋Š” dataframe.describe() ์ •๋„๊ฐ€ ๋˜๊ฒ ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ, PySpark๋Š” ํŒ๋‹ค์Šค์™€ ๋‹ฌ๋ฆฌ ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ ์นผ๋Ÿผ์—๋„ ํ‰๊ท ๊ฐ’, ํ‘œ์ค€ํŽธ์ฐจ ๋“ฑ๊ณผ ๊ฐ™์€ ์š”์•ฝํ†ต๊ณ„๋Ÿ‰๊ฐ’์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์ œ๊ณตํ•œ๋‹ค. ๋ฌผ๋ก  Null ๊ฐ’์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค. ๊ทธ๋ž˜์„œ PySpark์—์„œ๋Š” ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ์ˆ˜์น˜ํ˜• ํƒ€์ž…๋งŒ ๊ณ ๋ฅธ ํ›„ describe() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ์ดํ„ฐ ๋ช…์„ธ์„œ ์ •๋ณด๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์ฐธ๊ณ ๋กœ PySpark์—์„œ์˜ describe() ๋ฉ”์†Œ๋“œ๋Š” ์ŠคํŒŒํฌ์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋‚ด์šฉ๋ฌผ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” show() ์™€ ๊ฐ™์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ์žŠ์ง€๋ง์ž.

 

num_cols = [name for name, dtype in spark_df.dtypes if dtype != 'string']

spark_df.select(*num_cols).describe().show()  # ๊ทธ๋ƒฅ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ num_cols๋งŒ ๋„ฃ์–ด๋„ ๋™์ž‘ํ•˜๊ธด ํ•จ

3. ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ shape ์–ป๊ธฐ

๋‹ค์Œ์€ PySpark์˜ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ํ–‰, ์—ด ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์ฆ‰, shape๋ฅผ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํŒ๋‹ค์Šค๋Š” dataframe.shape ์ฝ”๋“œ๋งŒ ์น˜๋ฉด ํŠœํ”Œ ํ˜•ํƒœ๋กœ (ํ–‰์˜ ๊ฐœ์ˆ˜, ์—ด์˜ ๊ฐœ์ˆ˜) ๋‚˜์™”์ง€๋งŒ, ์ŠคํŒŒํฌ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ๋ชปํ•œ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์šฐ์„  ํŒ๋‹ค์Šค๋Š” ํ•˜๋‚˜์˜ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์˜ฌ๋ฆฌ๊ฒŒ ๋œ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ๋ชจ๋‘๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— shape ๋ผ๋Š” ์†์„ฑ ๊ฐ’์„ ์ด์šฉํ•ด์„œ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฐ˜๋ฉด์—, ์ŠคํŒŒํฌ๋Š” ์•Œ๋‹ค์‹œํ”ผ ์„œ๋ฒ„์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ถ„์‚ฐํ•˜์—ฌ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ํŒ๋‹ค์Šค์™€๋Š” ๋‹ฌ๋ฆฌ ํ•˜๋‚˜์˜ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ „์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ŠคํŒŒํฌ์—์„œ๋Š” shape๋ผ๋Š” ์†์„ฑ ๊ฐ’์„ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์—†๋‹ค.

 

๊ทธ๋ž˜์„œ ์ŠคํŒŒํฌ๋Š” ์•ฝ๊ฐ„ ๊ท€์ฐฎ์„์ง€๋ผ๋„ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ํ–‰, ์—ด ๊ฐœ์ˆ˜๋ฅผ ๊ฐ๊ฐ ๊ตฌํ•ด์ค€๋‹ค.

 

# ํ–‰ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
print('ํ–‰ ๊ฐœ์ˆ˜:', spark_df.count())

# ์—ด ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ
print('์—ด ๊ฐœ์ˆ˜:', len(spark_df.columns))

4. ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์—์„œ ํŠน์ • ์นผ๋Ÿผ๋“ค ์ถ”์ถœํ•˜๊ธฐ

์ด์ œ PySpark์—์„œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ์›ํ•˜๋Š” ์นผ๋Ÿผ์„ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ ์•Œ์•„๋ณผ ์นผ๋Ÿผ ์ถ”์ถœ ๋ฐฉ๋ฒ•์€ select() ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฐธ๊ณ ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ๋‹ค๋ฅธ ๋ฉ”์†Œ๋“œ๋“ค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ select() ๋ฉ”์†Œ๋“œ๋„ dataframe ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด์šฉ๋ฌผ์„ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ show() ๋ฉ”์†Œ๋“œ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์ถ”๊ฐ€๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ํŠน์ • ์นผ๋Ÿผ์„ ์ถ”์ถœํ•  ๋•Œ, ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋ฉด๋ฐ€ํžˆ ์‚ดํŽด๋ณด๋ฉด์„œ 5๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋ชจ๋‘ ์ ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๋„ ์•Œ์•„๋‘์ž. ์˜ˆ์ „ ์ŠคํŒŒํฌ ๋ฒ„์ ผ์—์„œ๋Š” ์›๋ž˜ ์นผ๋Ÿผ ์ด๋ฆ„์ด ๋‹ด๊ธด ๋ฆฌ์ŠคํŠธ๋ฅผ unpacking ํ•ด์„œ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ–ˆ์ง€๋งŒ ์ตœ๊ทผ ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋ฉด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ทธ๋ƒฅ ๋„ฃ์–ด์ฃผ์–ด๋„ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

from pyspark.sql.functions import col

# ๋ชจ๋“  ์นผ๋Ÿผ ์ถ”์ถœํ•˜๊ธฐ
spark_df.select('*').limit(3).show()

# Age๋ผ๋Š” ์นผ๋Ÿผ ํ•˜๋‚˜๋งŒ ์ถ”์ถœํ•˜๊ธฐ
spark_df.select('Age').limit(3).show()
spark_df.select(['Age']).limit(3).show()
spark_df.select(spark_df['Age']).limit(3).show()
spark_df.select(spark_df.Age).limit(3).show()
spark_df.select(col('Age')).limit(3).show()       # ์ž„ํฌํŠธํ•œ col ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ

# ์—ฌ๋Ÿฌ๊ฐœ์˜ ์นผ๋Ÿผ์„ ๋™์‹œ์— ์ถ”์ถœํ•˜๊ธฐ
spark_df.select('Name', 'Age').limit(3).show()
spark_df.select(['Name', 'Age']).limit(3).show()

 

๋‹ค์Œ์œผ๋กœ๋Š” pyspark.sql.functions ์—์„œ ์ œ๊ณตํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ํ•จ์ˆ˜๋“ค์„ ์ž„ํฌํŠธํ•ด์„œ ํŠน์ • ์นผ๋Ÿผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

from pyspark.sql.functions import max, min, avg
from pyspark.sql.functions import upper, lower


spark_df.select(max('Age').alias('Max_Age')).show()
spark_df.select(min('Pclass').alias('Min_Pclass')).show()
spark_df.select(avg('Age').alias('Avg_Age')).show()
spark_df.select(upper('Name').alias('Upper_Name')).limit(3).show()
# ๋ชจ๋“  ์นผ๋Ÿผ๊ณผ ๋ณ€ํ™˜์„ ์ค€ ์นผ๋Ÿผ ๋™์‹œ์— ์ถ”์ถœ
spark_df.select('*', lower(col('Name')).alias('Lower_Name')).limit(3).show()
๋ฐ˜์‘ํ˜•