当前位置:   article > 正文

SparkSql 数据类型转换_sparksql数组转换为字符串的方法

sparksql数组转换为字符串的方法

前言

数据类型转换这个在任何语言框架中都会涉及到,看起来非常简单,不过要把所有的数据类型都掌握还是需要一定的时间历练的

SparkSql数据类型

数字类型
  • ByteType:代表一个字节的整数。范围是-128到127
  • ShortType:代表两个字节的整数。范围是-32768到32767
  • IntegerType:代表4个字节的整数。范围是-2147483648到2147483647
  • LongType:代表8个字节的整数。范围是-9223372036854775808到9223372036854775807
  • FloatType:代表4字节的单精度浮点数
  • DoubleType:代表8字节的双精度浮点数
  • DecimalType:代表任意精度的10进制数据。通过内部的java.math.BigDecimal支持。BigDecimal由一个任意精度的整型非标度值和一个32位整数组成
  • StringType:代表一个字符串值
  • BinaryType:代表一个byte序列值
  • BooleanType:代表boolean值
  • Datetime类型
    TimestampType:代表包含字段年,月,日,时,分,秒的值
    DateType:代表包含字段年,月,日的值
复杂类型
  • ArrayType(elementType, containsNull):代表由elementType类型元素组成的序列值。containsNull用来指明ArrayType中的值是否有null值
  • MapType(keyType, valueType, valueContainsNull):表示包括一组键 - 值对的值。通过keyType表示key数据的类型,通过valueType表示value数据的类型。valueContainsNull用来指明MapType中的值是否有null值
  • StructType(fields):表示一个拥有StructFields (fields)序列结构的值
    StructField(name, dataType, nullable):代表StructType中的一个字段,字段的名字通过name指定,dataType指定field的数据类型,nullable表示字段的值是否有null值。

Spark Sql数据类型和Scala数据类型对比

sparksql 数据类型scala数据类型
ByteTypeByte
ShortTypeShort
IntegerTypeInt
LongTypeLong
FloatTypeFloat
DoubleTypeDouble
DecimalTypescala.math.BigDecimal
StringTypeString
BinaryTypeArray[Byte]
BooleanTypeBoolean
TimestampTypejava.sql.Timestamp
DateTypejava.sql.Date
ArrayTypescala.collection.Seq
MapTypescala.collection.Map
StructTypeorg.apache.spark.sql.Row
StructFieldThe value type in Scala of the data type of this field (For example, Int for a StructField with the data type IntegerType)

Spark Sql数据类型转换案例

一句话描述:调用Column类的cast方法

如何获取Column类

这个之前写过

df("columnName")            // On a specific `df` DataFrame.
col("columnName")           // A generic column not yet associated with a DataFrame.
col("columnName.field")     // Extracting a struct field
col("`a.column.with.dots`") // Escape `.` in column names.
$"columnName"               // Scala short hand for a named column.
  • 1
  • 2
  • 3
  • 4
  • 5
测试数据准备
1,tom,23
2,jack,24
3,lily,18
4,lucy,19
  • 1
  • 2
  • 3
  • 4
spark入口代码
val spark = SparkSession
      .builder()
      .appName("test")
      .master("local[*]")
      .getOrCreate()
  • 1
  • 2
  • 3
  • 4
  • 5
测试默认数据类型
spark.read.
      textFile("./data/user")
      .map(_.split(","))
      .map(x => (x(0), x(1), x(2)))
      .toDF("id", "name", "age")
      .dtypes
      .foreach(println)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结果:

(id,StringType)
(name,StringType)
(age,StringType)
  • 1
  • 2
  • 3

说明默认都是StringType类型

把数值型的列转为IntegerType
 import spark.implicits._
    spark.read.
      textFile("./data/user")
      .map(_.split(","))
      .map(x => (x(0), x(1), x(2)))
      .toDF("id", "name", "age")
      .select($"id".cast("int"), $"name", $"age".cast("int"))
      .dtypes
      .foreach(println)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

结果:

(id,IntegerType)
(name,StringType)
(age,IntegerType)
  • 1
  • 2
  • 3
Column类cast方法的两种重载
  • 第一种
    def cast(to: String): Column
    Casts the column to a different data type, using the canonical string representation of the type. The supported types are:
    string, boolean, byte, short, int, long, float, double, decimal, date, timestamp.
// Casts colA to integer.
df.select(df("colA").cast("int"))
Since
1.3.0
  • 1
  • 2
  • 3
  • 4
  • 第二种
    def cast(to: DataType): Column
    Casts the column to a different data type.
// Casts colA to IntegerType.
import org.apache.spark.sql.types.IntegerType
df.select(df("colA").cast(IntegerType))

// equivalent to
df.select(df("colA").cast("int"))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/603664
推荐阅读
  

闽ICP备14008679号