当前位置:   article > 正文

Spark SQL中StructField和StructType

structtype

每一天都会进行更新,一起冲击未来

StructField和StructType

        StructType---定义数据框的结构

        StructType定义DataFrame的结构,是StructField对象的集合或者列表,通过printSchema可以打印出所谓的表字段名,StructType就是所有字段的集合。在创建dataframe的时候,将StructType作为字段的集合,按照顺序一一给各个字段。

        StructField--定义DataFrame列的元数据

        StructField来定义列名,列类型,可为空的列和元数据。

将StructField和StructType和DataFrame一起使用

        首先创建样例类

  1. case class StructType(fields: Array[StructField])
  2. case class StructField(
  3. name: String,
  4. dataType: DataType,
  5. nullable: Boolean = true,
  6. metadata: Metadata = Metadata.empty)

        创建相关的数据以及字段名

  1. //创建数据集合
  2. val simpleData = Seq(
  3. Row("James ","","Smith","36636","M",3000),
  4. Row("Michael ","Rose","","40288","M",4000),
  5. Row("Robert ","","Williams","42114","M",4000),
  6. Row("Maria ","Anne","Jones","39192","F",4000),
  7. Row("Jen","Mary","Brown","","F",-1) )
  8. //创建StructType对象,里面是Array[StructField]类型
  9. val simpleSchema = StructType(Array(
  10. StructField("firstname",StringType,true),
  11. StructField("middlename",StringType,true),
  12. StructField("lastname",StringType,true),
  13. StructField("id", StringType, true),
  14. StructField("gender", StringType, true),
  15. StructField("salary", IntegerType, true) ))
  16. //创建dataFrame
  17. val df = spark.createDataFrame(
  18. spark.sparkContext.parallelize(simpleData),simpleSchema)
  19. //打印Schema
  20. df.printSchema()

        代码很简答,需要一个数据集合,创建一个StructType对象,里面包含StructField对象。

        前面说过,StructField对象里面包含的是列名以及各种信息。

        创建DataFrame。此时,元数据就是simpleData,所谓的Schema就是simpleSchema。

        看一下各个字段以及“表结构”

 

        其实上面的案例也比较有一些麻烦,下面来看一下另外一种方法,不用创建样例类

通过StructType.add进行操作

        通过StructType.add进行操作,意味着我们不用再去创建StructField对象,通过add方法,只需要写入字段名称和字段方法就可以完成这个操作。

  1. //创建上下文环境 SparkSql环境
  2. val sparkSQL = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
  3. val sparkSession = SparkSession.builder().config(sparkSQL).getOrCreate()
  4. import sparkSession.implicits._
  5. //数据集合
  6. val simpData = Seq(Row("James", "", "Smith", "36636", "M", 3000),
  7. Row("Michael", "Rose", "", "40288", "M", 4000),
  8. Row("Robert", "", "Williams", "42114", "M", 4000),
  9. Row("Maria", "Anne", "Jones", "39121", "F", 4000),
  10. Row("Jen", "Mary", "Brown", "", "F", -1))
  11. //创建StructType对象,将字段进行累加
  12. val structType = new StructType()
  13. .add("firstname", StringType)
  14. .add("middlename", StringType)
  15. .add("lastname", StringType)
  16. .add("id", StringType)
  17. .add("gender", StringType)
  18. .add("salary", StringType)
  19. //创建DataFrame
  20. val dataFrame = sparkSession.createDataFrame(
  21. sparkSession.sparkContext.parallelize(simpData), structType)
  22. dataFrame.printSchema()
  23. sparkSession.close()

        同样也是需要数据集合以及StructType对象。不过这种操作更加的简便,重要的是不会报错,用最上面的方法创建样例类可能会报错,需要导入不同的包。

使用StructType进行嵌套字段

  1. //创建Spark SQL环境
  2. val sparkSQL = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
  3. val sparkSession = SparkSession.builder().config(sparkSQL).getOrCreate()
  4. import sparkSession.implicits._
  5. //创建数据集,其中最里面的Row对象就是嵌套对象
  6. val structData = Seq( Row(Row("James ", "", "Smith"), "36636", "M", 3100),
  7. Row(Row("Michael ", "Rose", ""), "40288", "M", 4300),
  8. Row(Row("Robert ", "", "Williams"), "42114", "M", 1400),
  9. Row(Row("Maria ", "Anne", "Jones"), "39192", "F", 5500),
  10. Row(Row("Jen", "Mary", "Brown"), "", "F", -1))
  11. //通过StructType的add方法进行添加字段
  12. val structType = new StructType()
  13. .add("name",new StructType()
  14. .add("firstname",StringType)
  15. .add("middlename",StringType)
  16. .add("lastname",StringType))
  17. .add("id",StringType)
  18. .add("gender",StringType)
  19. .add("salary",StringType)
  20. //创建dataframe
  21. val dataFrame =
  22. sparkSession.createDataFrame(
  23. sparkSession.sparkContext.parallelize(structData), structType)
  24. //打印schema
  25. dataFrame.printSchema()
  26. sparkSession.close()

        因为name字段进行了嵌套,因此在"name"字段后面的类型里面不再是StringType.而是一个嵌套类型 StructType,这个嵌套类型里面再继续进行add。在这里面嵌套了三个字段。

        可以看上面Schema。那么字段的类型是Struct结构。这个Struct结构里面嵌套了三个字段。

        其实上面写错了,纠正一下,最后一个字段应该是IntegerType类型

        如果写StringType类型,虽然打印Schema没有报错,但是进行select的时候就会报错。所以需要进行修改,在这里说明一下。

        dataFrame.select("name").show(false)

        看一下嵌套字段的name

 

         本来以为Spark SQL的知识只有一点点,没有想到的是Spark SQL里面的知识很多很多,不单单是SQL语言,虽然可以结合Hive或者Mysql写SQL,但是结构化数据使用本身的DSL+SQL更加的简单。

        SQL是重中之重,SQL能解决90%问题,剩下解决不了的问题就交给RDD把        


                
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/603764
推荐阅读
相关标签
  

闽ICP备14008679号