[Spark실습]DataFrame 생성 및 Schema 정의
- IT 정보/Hadoop Eco System
- 2018. 1. 30.
devDF = spark.read.json("/loudacre/devices.json").show(3)
+--------+------+--------+-----+--------------------+
|dev_type|devnum| make|model| release_dt|
+--------+------+--------+-----+--------------------+
| phone| 1|Sorrento| F00L|2008-10-21T00:00:...|
| phone| 2| Titanic| 2100|2010-04-19T00:00:...|
| phone| 3| MeeToo| 3.0|2011-02-18T00:00:...|
+--------+------+--------+-----+--------------------+
only showing top 3 rows
/loudacre/devices.json 파일을 DataFrame으로 불러온다.
devDF.printSchema()
root
|-- dev_type: string (nullable = true)
|-- devnum: long (nullable = true)
|-- make: string (nullable = true)
|-- model: string (nullable = true)
|-- release_dt: string (nullable = true)
spark가 JSON 파일의 스키마를 유추한것을 보면 release_dt가 실제로는 timestamp 타입임에도 string 타입으로 유추한 것을 볼 수 있다.따라서 올바른 스키마를 정의하기 위해 아래와 같이 클래스를 불러온다.
from pyspark.sql.types import *
devColumns = [
StructField("dev_type",StringType()),
StructField("devnum",LongType()),
StructField("make",StringType()),
StructField("model",StringType()),
StructField("release_dt",TimestampType())
]
이와 같이 각 Column에 대한 데이터 타입을 명확하게 정의해 주는 StructField 객체의 컬렉션을 만들어준다.release_dt 컬럼의 데이터 타입은 TimestampType으로 정의해준다.
devSchema = StructType(devColumns)
앞서 만든 Column 리스트를 가지고 스키마(StructType 객체)를 만들어줍니다.
devDF = spark.read.schema(devSchema).json("/loudacre/devices.json")
새로운 스키마를 이용하여 devDF DataFrame을 다시 만들어 줍니다.
devDF.printSchema()
root
|-- dev_type: string (nullable = true)
|-- devnum: long (nullable = true)
|-- make: string (nullable = true)
|-- model: string (nullable = true)
|-- release_dt: timestamp (nullable = true)
다시 devDF의 스키마를 보면 release_dt의 데이터 타입이 timestamp로 정의되어 있는 것을 확인할 수 있습니다.
devDF.write.save("/loudacre/devices_parquet")
device 데이터에 정확한 스키마를 정의했으므로 스키마를 포함하는 parquet 형식으로 데이터를 저장한다.
schemaDevDF = spark.read.parquet("/loudacre/devices_parquet")
위에서 저장한 parquet 파일을 다시 DataFrame으로 불러온다.
schemaDevDF.printSchema()
root
|-- dev_type: string (nullable = true)
|-- devnum: long (nullable = true)
|-- make: string (nullable = true)
|-- model: string (nullable = true)
|-- release_dt: timestamp (nullable = true)
그리고 schema를 확인해 보면 다음과 같이 release_dt 컬럼이 정의한대로 timestamp 데이터 타입임을 알 수 있다.