共计 4100 个字符,预计需要花费 11 分钟才能阅读完成。
Spark 中 DataFrame 中字段对应的数据类型有很多,常见的float
、string
等数据类型
1. 全部的数据类型
StringType | ShortType |
---|---|
ArrayType | IntegerType |
MapType | LongType |
StructType | FloatType |
DateType | DoubleType |
TimestampType | DecimalType |
BooleanType | ByteType |
CalendarIntervalType | HiveStringType |
BinaryType | ObjectType |
NumericType | NullType |
1.1 共同的方法
上面列举出来的数据类型都继承 DataType
这个类。
val arr = ArrayType(IntegerType,false)
println("json() : "+arrayType.json) // Represents json string of datatype
println("prettyJson() : "+arrayType.prettyJson) // Gets json in pretty format
println("simpleString() : "+arrayType.simpleString) // simple string
println("sql() : "+arrayType.sql) // SQL format
println("typeName() : "+arrayType.typeName) // type name
println("catalogString() : "+arrayType.catalogString) // catalog string
println("defaultSize() : "+arrayType.defaultSize) // default size
输出
json() : {"type":"array","elementType":"string","containsNull":true}
prettyJson() : {
"type" : "array",
"elementType" : "string",
"containsNull" : true
}
simpleString() : array<string>
sql() : ARRAY<STRING>
typeName() : array
catalogString() : array<string>
defaultSize() : 20
1.2 DataType.fromJson()
从 json 中加载数据变成 DataType
val typeFromJson = DataType.fromJson(
"""{"type":"array",
|"elementType":"string","containsNull":false}""".stripMargin)
println(typeFromJson.getClass)
val typeFromJson2 = DataType.fromJson("\"string\"")
println(typeFromJson2.getClass)
//This prints
class org.apache.spark.sql.types.ArrayType
class org.apache.spark.sql.types.StringType$
1.3 DataType.fromDDL()
上一个方法 json 是常见的,DDL 乍一看有点懵,[Data Definition Language] -DDL ,之前在学习 HIVE的时候有看到过。
val ddlSchemaStr = "`fullName` STRUCT<`first`: STRING, `last`: STRING," +
"`middle`: STRING>,`age` INT,`gender` STRING"
val ddlSchema = DataType.fromDDL(ddlSchemaStr)
println(ddlSchema.getClass)
// This prints
class org.apache.spark.sql.types.StructType
2. 构建对应类型对象数据.
//Below are some examples
val strType = DataTypes.StringType
val arrayType = DataTypes.createArrayType(StringType)
val structType = DataTypes.createStructType(
Array(DataTypes.createStructField("fieldName",StringType,true)))
3. StringType
从这个包里引入 “org.apache.spark.sql.types.StringType
” 可以得到 SringType
表示 String 数据, 除了这个方法也可以使用前面介绍的DataTypes.StringType
val strType = DataTypes.StringType
println("json : "+strType.json)
println("prettyJson : "+strType.prettyJson)
println("simpleString : "+strType.simpleString)
println("sql : "+strType.sql)
println("typeName : "+strType.typeName)
println("catalogString : "+strType.catalogString)
println("defaultSize : "+strType.defaultSize)
Outputs
json : "string"
prettyJson : "string"
simpleString : string
sql : STRING
typeName : string
catalogString : string
defaultSize : 20
4. ArrayType
ArrayType 顾名思义存储的数组类型,这个在实践过程中存储序列特征之类的数据。
它提供了一些方法:containsNull()
, elementType()
, productElement()
containNull
是判断是否包含Null
val arr = ArrayType(IntegerType,false)
val arrayType = DataTypes.createArrayType(StringType,true)
println("containsNull : "+arrayType.containsNull)
println("elementType : "+arrayType.elementType)
println("productElement : "+arrayType.productElement(0))
输出如下所示
containsNull : true
elementType : StringType
productElement : StringType
更多的一些方法可以参考 Using ArrayType on DataFrame
5. MapType
MapType 存储的是< key ,value>的形式,这个是常见的数据存储类型。DataTypes.createMapType()or
MapType(),两种方法构建的MapType对象 ,它包含了一些常用的方法:keyType()
, valueType()
, valueContainsNull()
, productElement()
to name a few.
val mapType1 = MapType(StringType,IntegerType)
val mapType = DataTypes.createMapType(StringType,IntegerType)
println("keyType() : "+mapType.keyType)
println("valueType() : "+mapType.valueType)
println("valueContainsNull() : "+mapType.valueContainsNull)
println("productElement(1) : "+mapType.productElement(1))
输出如下所示:
keyType() : StringType
valueType() : IntegerType
valueContainsNull() : true
productElement(1) : IntegerType
6. DateType 日期类型
7. TimestampType 时间戳类型
8. SructType 结构体类型
还是要提下这个类型,这个应该是日常使用最多,在Tfrecord 生产的时候会使用它构建对应的schema,然后获取数据保存成 tfrecord。构建的方式其实跟之前介绍的差不都,因为都是继承DataType
所以常见的
//StructType
val structType = DataTypes.createStructType(
Array(DataTypes.createStructField("fieldName",StringType,true)))
val simpleSchema = StructType(Array(
StructField("name",StringType,true),
StructField("id", IntegerType, true),
StructField("gender", StringType, true),
StructField("salary", DoubleType, true)
))
val anotherSchema = new StructType()
.add("name",new StructType()
.add("firstname",StringType)
.add("lastname",StringType))
.add("id",IntegerType)
.add("salary",DoubleType)