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

StructField和StructType

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

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

        StructField--定义DataFrame列的元数据

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

将StructField和StructType和DataFrame一起使用

   首先创建样例类

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

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

//创建数据集合
val simpleData = Seq(
Row("James ","","Smith","36636","M",3000),
Row("Michael ","Rose","","40288","M",4000),
Row("Robert ","","Williams","42114","M",4000),
Row("Maria ","Anne","Jones","39192","F",4000),
Row("Jen","Mary","Brown","","F",-1) )
//创建StructType对象,里面是Array[StructField]类型
val simpleSchema = StructType(Array(StructField("firstname",StringType,true),
StructField("middlename",StringType,true),
StructField("lastname",StringType,true),
StructField("id", StringType, true),
StructField("gender", StringType, true),
StructField("salary", IntegerType, true) ))
//创建dataFrame
val df = spark.createDataFrame(
spark.sparkContext.parallelize(simpleData),simpleSchema)
//打印Schemadf.printSchema()

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

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

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

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

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

通过StructType.add进行操作

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

//创建上下文环境 SparkSql环境
val sparkSQL = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
val sparkSession = SparkSession.builder().config(sparkSQL).getOrCreate()
import sparkSession.implicits._
//数据集合
val simpData = Seq(Row("James", "", "Smith", "36636", "M", 3000),
Row("Michael", "Rose", "", "40288", "M", 4000),Row("Robert", "", "Williams", "42114", "M", 4000),
Row("Maria", "Anne", "Jones", "39121", "F", 4000),
Row("Jen", "Mary", "Brown", "", "F", -1))//创建StructType对象,将字段进行累加
val structType = new StructType()
.add("firstname", StringType)
.add("middlename", StringType)
.add("lastname", StringType)
.add("id", StringType)
.add("gender", StringType)
.add("salary", StringType)//创建DataFrameval dataFrame = sparkSession.createDataFrame(
sparkSession.sparkContext.parallelize(simpData), structType)
dataFrame.printSchema()
sparkSession.close()

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

使用StructType进行嵌套字段

//创建Spark SQL环境
val sparkSQL = new SparkConf().setMaster("local[*]").setAppName("SparkSQL")
val sparkSession = SparkSession.builder().config(sparkSQL).getOrCreate()
import sparkSession.implicits._
//创建数据集,其中最里面的Row对象就是嵌套对象
val structData = Seq( Row(Row("James ", "", "Smith"), "36636", "M", 3100),Row(Row("Michael ", "Rose", ""), "40288", "M", 4300),
Row(Row("Robert ", "", "Williams"), "42114", "M", 1400),
Row(Row("Maria ", "Anne", "Jones"), "39192", "F", 5500),Row(Row("Jen", "Mary", "Brown"), "", "F", -1))
//通过StructType的add方法进行添加字段
val structType = new StructType()
.add("name",new StructType()
.add("firstname",StringType)
.add("middlename",StringType)
.add("lastname",StringType))
.add("id",StringType)
.add("gender",StringType)
.add("salary",StringType)
//创建dataframe
val dataFrame =
sparkSession.createDataFrame(
sparkSession.sparkContext.parallelize(structData), structType)
//打印schema
dataFrame.printSchema()
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把

Spark SQL中StructField和StructType相关推荐

  1. Spark SQL 中UDF的讲解

    Spark SQL 中UDF的讲解 User Define Function, 用户自定义函数,简称UDF,存在与很多组件中. 在使用Sparksql的人都遇到了Sparksql所支持的函数太少了的难 ...

  2. Spark SQL中的DataFrame

    在2014年7月1日的 Spark Summit 上,Databricks 宣布终止对 Shark 的开发,将重点放到 Spark SQL 上.在会议上,Databricks 表示,Shark 更多是 ...

  3. Spark SQL中出现 CROSS JOIN 问题解决

    Spark SQL中出现 CROSS JOIN 问题解决 参考文章: (1)Spark SQL中出现 CROSS JOIN 问题解决 (2)https://www.cnblogs.com/yjd_hy ...

  4. 解决数据倾斜一:RDD执行reduceByKey或则Spark SQL中使用group by语句导致的数据倾斜

    一:概述 有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的 ...

  5. Spark SQL中 RDD 转换到 DataFrame (方法二)

    强调它与方法一的区别:当DataFrame的数据结构不能够被提前定义.例如:(1)记录结构已经被编码成字符串 (2) 结构在文本文件中,可能需要为不同场景分别设计属性等以上情况出现适用于以下方法.1. ...

  6. 如何查询spark版本_掌握Spark SQL中的查询执行

    了解您的查询计划 自从Spark 2.x以来,由于SQL和声明性DataFrame API,在Spark中查询数据已成为一种奢侈. 仅使用几行高级代码就可以表达非常复杂的逻辑并执行复杂的转换. API ...

  7. spark sql中的窗口函数

    2019独角兽企业重金招聘Python工程师标准>>> databricks博客给出的窗口函数概述 Spark SQL supports three kinds of window ...

  8. spark sql中的first函数在多个字段使用实例

    1.建立hive表如下: CREATE EXTERNAL TABLE `newsapp.test_first`(`userkey` string, `publish_id` string, `data ...

  9. spark官方文档_这些未在 Spark SQL 文档中说明的优化措施,你知道吗?

    本文来自上周(2020-11-17至2020-11-19)举办的 Data + AI Summit 2020 (原 Spark+AI Summit),主题为<Spark SQL Beyond O ...

最新文章

  1. AVR开发 Arduino方法(附四) 参考文献与网址
  2. Socket recv()之前进行select代码
  3. VMware View 5.0 Ready! 资源汇总(持续更新)
  4. 【评估价格】采购申请中的价格
  5. 专访《王者荣耀》美术总监:用6年研究东方美学
  6. 如何使用json开发web_如何通过使用JSON Web令牌简化应用程序的身份验证
  7. HDU 3441 Rotation
  8. STM32中用 stop 模式 配合低功耗模式下的自动唤醒(AWU) 能否实现FreeRTOS tickless 模式...
  9. Windows下使用platform.pk8 和platform.x509.pem生成jks签名文件
  10. 药易通采购过账存储过程ts_c_BillAudit 分析
  11. 主机名、域名、 IP地址之间的关系
  12. 腾讯蔡晨:十年沉淀,腾讯iOA为企业安全保驾护航
  13. 【应用笔记】APM32F4xx_ADC应用笔记
  14. qt对excel的基本操作
  15. 解决WIN10打开XBOX闪退问题(2022)
  16. NB-IOT修改KV值的方法
  17. 通俗易懂物联网(1):什么是物联网?
  18. 软件生命周期中的测试概念,IT软件生命周期中的重要概念
  19. WebGL 3D 数百个 HTML5 例子学习 HT 图形组件
  20. HTTP请求报文和响应报文信息

热门文章

  1. 蓝桥杯, 38线译码器74Hc138
  2. csp刷题总结(如此编码python版本)
  3. EntityFramework笔记
  4. webp格式如何转成png?
  5. 9个学习资源分享给大家,总有你需要的干货!
  6. Chrome 53 Beta一些有意思的改动
  7. 爪哇国新游记之七----使用ArrayList统计水果出现次数
  8. python+ opencv实现摄像头实时人脸识别并实现汉字标框
  9. 如何创建自己的 Google Chrome 扩展程序
  10. MPI实现并行pagerank