ML 데이터소스
ML 데이터소스 (ML Data Sources)
이 섹션에서는 ML에서 데이터를 불러올 때 데이터소스를 어떻게 쓰는지 소개해요. Parquet, CSV, JSON, JDBC 같은 일반 데이터소스 외에도 ML 전용 데이터소스를 몇 가지 제공해요.
출처: ML Data Sources
본문
- Image 데이터소스
- LIBSVM 데이터소스
Image 데이터소스
이 이미지 데이터소스는 디렉터리에서 이미지 파일을 불러와요. 압축된 이미지(jpeg, png 등)를 Java 라이브러리의 ImageIO를 통해 원시 이미지 표현으로 로드할 수 있어요. 로드된 DataFrame은 image라는 StructType 컬럼 하나를 가지며, 그 컬럼에는 이미지 스키마로 저장된 이미지 데이터가 들어 있어요.
image 컬럼의 스키마는 다음과 같아요.
origin:StringType(이미지의 파일 경로)height:IntegerType(이미지의 높이)width:IntegerType(이미지의 너비)nChannels:IntegerType(이미지 채널 수)mode:IntegerType(OpenCV 호환 타입)data:BinaryType(OpenCV 호환 순서의 이미지 바이트 — 대부분 행 단위 BGR)
PySpark에서는 이미지 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 제공해요.
>>> df = spark.read.format("image").option("dropInvalid", True).load("data/mllib/images/origin/kittens")
>>> df.select("image.origin", "image.width", "image.height").show(truncate=False)
+-----------------------------------------------------------------------+-----+------+
|origin |width|height|
+-----------------------------------------------------------------------+-----+------+
|file:///spark/data/mllib/images/origin/kittens/54893.jpg |300 |311 |
|file:///spark/data/mllib/images/origin/kittens/DP802813.jpg |199 |313 |
|file:///spark/data/mllib/images/origin/kittens/29.5.a_b_EGDP022204.jpg |300 |200 |
|file:///spark/data/mllib/images/origin/kittens/DP153539.jpg |300 |296 |
+-----------------------------------------------------------------------+-----+------+
ImageDataSource는 이미지 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 구현해요.
scala> val df = spark.read.format("image").option("dropInvalid", true).load("data/mllib/images/origin/kittens")
df: org.apache.spark.sql.DataFrame = [image: struct<origin: string, height: int ... 4 more fields>]
scala> df.select("image.origin", "image.width", "image.height").show(truncate=false)
+-----------------------------------------------------------------------+-----+------+
|origin |width|height|
+-----------------------------------------------------------------------+-----+------+
|file:///spark/data/mllib/images/origin/kittens/54893.jpg |300 |311 |
|file:///spark/data/mllib/images/origin/kittens/DP802813.jpg |199 |313 |
|file:///spark/data/mllib/images/origin/kittens/29.5.a_b_EGDP022204.jpg |300 |200 |
|file:///spark/data/mllib/images/origin/kittens/DP153539.jpg |300 |296 |
+-----------------------------------------------------------------------+-----+------+
Java에서는 ImageDataSource가 이미지 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 구현해요.
Dataset<Row> imagesDF = spark.read().format("image").option("dropInvalid", true).load("data/mllib/images/origin/kittens");
imageDF.select("image.origin", "image.width", "image.height").show(false);
/*
Will output:
+-----------------------------------------------------------------------+-----+------+
|origin |width|height|
+-----------------------------------------------------------------------+-----+------+
|file:///spark/data/mllib/images/origin/kittens/54893.jpg |300 |311 |
|file:///spark/data/mllib/images/origin/kittens/DP802813.jpg |199 |313 |
|file:///spark/data/mllib/images/origin/kittens/29.5.a_b_EGDP022204.jpg |300 |200 |
|file:///spark/data/mllib/images/origin/kittens/DP153539.jpg |300 |296 |
+-----------------------------------------------------------------------+-----+------+
*/
SparkR에서도 이미지 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 제공해요.
> df = read.df("data/mllib/images/origin/kittens", "image")
> head(select(df, df$image.origin, df$image.width, df$image.height))
1 file:///spark/data/mllib/images/origin/kittens/54893.jpg
2 file:///spark/data/mllib/images/origin/kittens/DP802813.jpg
3 file:///spark/data/mllib/images/origin/kittens/29.5.a_b_EGDP022204.jpg
4 file:///spark/data/mllib/images/origin/kittens/DP153539.jpg
width height
1 300 311
2 199 313
3 300 200
4 300 296
LIBSVM 데이터소스
이 LIBSVM 데이터소스는 디렉터리에서 'libsvm' 타입 파일을 불러와요. 로드된 DataFrame에는 두 개의 컬럼이 있어요. label은 double로 저장된 레이블을, features는 Vector로 저장된 피처 벡터를 담아요.
각 컬럼의 스키마는 다음과 같아요.
label:DoubleType(인스턴스 레이블)features:VectorUDT(피처 벡터)
PySpark에서는 LIBSVM 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 제공해요.
>>> df = spark.read.format("libsvm").option("numFeatures", "780").load("data/mllib/sample_libsvm_data.txt")
>>> df.show(10)
+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|(780,[127,128,129...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[124,125,126...|
| 1.0|(780,[152,153,154...|
| 1.0|(780,[151,152,153...|
| 0.0|(780,[129,130,131...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[99,100,101,...|
| 0.0|(780,[154,155,156...|
| 0.0|(780,[127,128,129...|
+-----+--------------------+
only showing top 10 rows
LibSVMDataSource는 LIBSVM 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 구현해요.
scala> val df = spark.read.format("libsvm").option("numFeatures", "780").load("data/mllib/sample_libsvm_data.txt")
df: org.apache.spark.sql.DataFrame = [label: double, features: vector]
scala> df.show(10)
+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|(780,[127,128,129...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[124,125,126...|
| 1.0|(780,[152,153,154...|
| 1.0|(780,[151,152,153...|
| 0.0|(780,[129,130,131...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[99,100,101,...|
| 0.0|(780,[154,155,156...|
| 0.0|(780,[127,128,129...|
+-----+--------------------+
only showing top 10 rows
Java에서는 LibSVMDataSource가 LIBSVM 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 구현해요.
Dataset<Row> df = spark.read.format("libsvm").option("numFeatures", "780").load("data/mllib/sample_libsvm_data.txt");
df.show(10);
/*
Will output:
+-----+--------------------+
|label| features|
+-----+--------------------+
| 0.0|(780,[127,128,129...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[124,125,126...|
| 1.0|(780,[152,153,154...|
| 1.0|(780,[151,152,153...|
| 0.0|(780,[129,130,131...|
| 1.0|(780,[158,159,160...|
| 1.0|(780,[99,100,101,...|
| 0.0|(780,[154,155,156...|
| 0.0|(780,[127,128,129...|
+-----+--------------------+
only showing top 10 rows
*/
SparkR에서도 LIBSVM 데이터를 DataFrame으로 불러오는 Spark SQL 데이터소스 API를 제공해요.
> df = read.df("data/mllib/sample_libsvm_data.txt", "libsvm")
> head(select(df, df$label, df$features), 10)
label features
1 0 <environment: 0x7fe6d35366e8>
2 1 <environment: 0x7fe6d353bf78>
3 1 <environment: 0x7fe6d3541840>
4 1 <environment: 0x7fe6d3545108>
5 1 <environment: 0x7fe6d354c8e0>
6 0 <environment: 0x7fe6d35501a8>
7 1 <environment: 0x7fe6d3555a70>
8 1 <environment: 0x7fe6d3559338>
9 0 <environment: 0x7fe6d355cc00>
10 0 <environment: 0x7fe6d35643d8>
더 알아보기 (Learn more)
- MLlib Main Guide — DataFrame 기반 ML API의 전반적인 내용.
- ML 파이프라인 — 데이터소스에서 불러온 데이터를 파이프라인으로 다루는 방법.