SparkSql系列(9/25) 数据类型

3,881次阅读
一条评论

共计 4100 个字符,预计需要花费 11 分钟才能阅读完成。

Spark 中 DataFrame 中字段对应的数据类型有很多,常见的floatstring等数据类型

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()orMapType(),两种方法构建的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)
正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2021-08-27发表,共计4100字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(一条评论)
验证码