sql编程基础 pdf SQL的API允许直接使用而不用必须去注册临时表
2021-09-01
内容
基本介绍
模型和模型是 SQL 提供的两个编程抽象。核心编程主要是使用和模型进行编程,以及它们之间的关系和转换。
在 Core 中,如果要执行应用程序,首先需要构建上下文环境对象。 SQL其实可以理解为Core的一种封装。不仅封装了模型,还封装了上下文环境对象。
旧版本提供了两个SQL查询起点:
是最新的SQL查询的起点,本质上是and的组合,所以API可以在on上使用,也可以在on上使用。内部封装了,所以计算实际上是由.
SQL API 允许直接使用,无需注册临时表或生成 SQL 表达式。 API 既有操作又有操作。
创建
在SQL中,是创建和执行SQL的入口。共有三种创建方式:
(1)由
的数据源创建
①进入
[xzc@hadoop102 spark-local]$ bin/spark-shell
②查看支持文件创建的数据源格式
scala> spark.read.
③在
的bin/data目录下创建user.json文件
{"username": "zhangsan","age":20}
{"username": "lisi", "age":30}
{"username": "wangwu", "age":40}
④读取json文件创建
scala> val df = spark.read.json("data/user.json")
⑤显示结果
scala> df.show
(2)从RDD转换
在IDEA中开发程序时,如果需要RDD和DF或DS的互操作,需要引入如下代码:
import spark.implicits._
这里不是包名in,而是创建对象的变量名,所以必须先创建对象再导入。这里的对象不能用var声明,因为只支持引入val修饰的对象。在-中,不需要导入,这个操作是自动完成的。
①在
的bin/data目录下创建id.txt文件
②读取txt文件
scala> val idRDD = sc.textFile("data/id.txt")
③转换并显示结果
scala> idRDD.toDF("id").show
注意:在实际开发中,RDD一般转换为
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",40))).map(t=>User(t._1, t._2)).toDF.show
(3)从 Hive 查询返回
Hive 是 SQL 引擎。 SQL 可以在有或没有 Hive 支持的情况下编译。包含 Hive 支持的 SQL 可以支持 Hive 表访问、UDF(用户自定义函数)和 Hive 查询语言(/HQL)等。需要强调的是,如果要在 SQL 中包含 Hive 库,则不需要提前安装Hive。要将 SQL 连接到已部署的 Hive,您必须将 hive-site.xml 复制到配置文件目录 ($/conf)。即使没有部署Hive,SQL仍然可以运行。
下载hive-site.xml文件,需要根据自己的配置修改个别内容
注意:如果你还没有部署Hivesql编程基础 pdf,SQL会在当前工作目录下创建自己的Hive元数据仓库,称为它。此外,如果您尝试使用 (not) 语句创建表,这些表将被放置在您默认文件系统的 /user/hive/ 目录中(如果您有一个完善的 hdfs-site.xml ,则默认文件系统为HDFS,否则为本地文件系统)。
- Hive 默认支持;代码中默认不支持,需要手动指定(加个参数即可)。
1) 嵌入式 HIVE
如果你使用内嵌的Hive,你什么都不用做,直接使用即可。
存储Hive的元数据,默认仓库地址:$/-
①展示
scala> spark.sql("show tables").show
②创建表格
scala> spark.sql("create table aa(id int)")
③将本地数据加载到表格中并显示
scala> spark.sql("load data local inpath 'data/id.txt' into table aa")
scala> spark.sql("select * from aa").show
注意:在实际使用中,几乎没有人会使用内置的Hive
2)外的HIVE
如果要连接到外部部署的 Hive,则需要执行以下步骤:
是强类型数据集合,需要提供对应的类型信息。
创建
有两种创建方式:
(1) with
①创建示例类
scala> case class Person(name: String, age: Long)
②向表格中添加数据并显示
scala> val caseClassDS = Seq(Person("zhangsan",2)).toDS()
scala> caseClassDS.show
(2)使用基本类型的序列创建
①创建
scala> val ds = Seq(1,2,3,4,5).toDS
②显示数据
scala> ds.show
注意:在实际使用中,很少用于将序列转换成,更多的是通过RDD获取
将 RDD 转换为
包含case类的RDD可以自动转换为case类定义的结构,通过反射将case类属性转换为表的列名。 Case 类可以包含复杂的结构,例如 Seq 或 Seq。
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS
转换为RDD
其实也是对RDD的封装,所以可以直接获取内部RDD
scala> case class User(name:String, age:Int)
scala> sc.makeRDD(List(("zhangsan",30), ("lisi",49))).map(t=>User(t._1, t._2)).toDS
scala> val rdd = res11.rdd
scala> rdd.collect
和转化
实际上是一个特例,所以它们可以相互转换。
(1)被转换为
scala> case class User(name:String, age:Int)
scala> val df = sc.makeRDD(List(("zhangsan",30), ("lisi",49))).toDF("name","age")
scala> val ds = df.as[User]
(2) 转换为
scala> val ds = df.as[User]
scala> val df = ds.toDF
RDD与RDD的关系
In 为我们提供了两个新的抽象,即 and。它们和RDD有什么区别?首先从版本生成的角度:
如果给这三个数据结构赋予相同的数据sql编程基础 pdf,分别计算后,都会给出相同的结果。区别在于它们的执行效率和执行方法。在以后的版本中,可能会逐渐取代RDD,成为唯一的API接口。
三者的共同点
(1)RDD,都是平台下的分布式弹性数据集,为处理超大数据提供了便利;
(2)三者都有惰性机制,创建转换的时候,比如map方法,不会立即执行,只有遇到比如,三者才会开始遍历操作;
(3)三者有很多常用的功能,比如,排序等;
(4)很多操作都需要这个包:.._(创建对象后尝试直接导入)
(5)三者会根据内存情况自动缓存操作,这样即使数据量很大也不必担心内存溢出
(6)三个都有
的概念
(7)和两者都可以使用模式匹配来获取每个字段的值和类型
三者的区别
(1)RDD
(2)
(3)
三者相互转换。