린아저씨의 잡학사전

Working with DataFrames and Schemas

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 데이터 타입임을 알 수 있다.

공유하기

facebook twitter kakaoTalk kakaostory naver band