Spark 2.4 支持图片格式数据源了

Spark2.4开始支持内置的图片数据源读取器,可以直接读取图片的数据。

val df = spark.read.format("image").load("/opt/pic/")

目录可以还可以是/path/to/dir/**和分区目录。

Image Schema

读取的数据会生成一个DF,该DF就一列列名字叫做 image。但是其实他是个嵌套数据结构,具体结构如下:

root

|– image: struct (nullable = true)

| |– origin: string (nullable = true)

| |– height: integer (nullable = true)

| |– width: integer (nullable = true)

| |– nChannels: integer (nullable = true)

| |– mode: integer (nullable = true)

| |– data: binary (nullable = true)

orgin:代表图片的路径。

nChannels:颜色通道的数量。对于灰度图像,典型值为1,对于彩色图像(例如,RGB),典型值为3,对于具有alpha通道的彩色图像,典型值为4。

mode:整数标志,提供有关如何解释数据字段的信息。它指定数据存储的数据类型和通道顺序。希望(但不强制)字段的值映射到下面显示的OpenCV类型之一。OpenCV类型定义为1,2,3或4个通道,并为像素值定义了几种数据类型。通道顺序指定颜色的存储顺序。例如,如果有一个包含红色,蓝色和绿色组件的典型三通道图像,则有六种可能的排序。大多数库使用RGB或BGR。希望三(4)个通道OpenCV类型为BGR(A)顺序。

OpenCV中的类型到数字的映射(数据类型x通道数)

data:以二进制格式存储的图像数据。图像数据表示为具有尺寸形状(高度,宽度,n通道)和由schema字段指定的类型t的数组值的三维阵列。该数组以row-major顺序存储。

通道顺序(channel order)

通道顺序指定存储颜色的顺序。例如,如果您有一个包含红色,蓝色和绿色组件的典型三通道图像,则有六种可能的排序。大多数库使用RGB或BGR。预计三(4)个通道OpenCV类型为BGR(A)顺序

案例

对于有监督学习,可以用label作为分区列,目前label仅仅支持数字类型。

val spark = SparkSession

.builder()

.appName("Spark reads pics")

.master("local[2]")

.getOrCreate()


val df = spark.read.format("image").load("/opt/pic")


df.printSchema()

df.select(col("label"),

col("image.origin"),

col("image.height"),

col("image.width"),

col("image.nChannels"),

col("image.mode")).show(1,false)


spark.stop()

关于图片处理,目前spark支持的算法并不是很多,希望后续版本继续完善吧。

数据下载地址

http://download.tensorflow.org/example_images/flower_photos.tgz

750好友一起学习大数据了~