1、什么是 Spark DataFrame & SQL?
Spark DataFrame 是一个带有列名称的分布式数据集,类似于关系型数据库中的一张表,可以通过结构化的数据文件,Hive中的表,外部数据库以及已经存在的RDD得到。(通过Rdd来创建DataFrame)
Spark SQL 是使用 SQL 或 HiveQL 语法编写 SQL 语句,来执行计算任务。
2、Spark DataFrame & SQL 引入动机?
1)Spark DataFrame & SQL 执行效率相比 RDD 更高
2)Spark DataFrame & SQL 代码更简洁
3)Spark DataFrame & SQL 带有自动优化程序引擎
3、 DataFrame 读取数据(如何把一个文件生成一个dataFrame)
// json 文件路径 val path = "file:///home/aboutyun/examples/src/main/resources/people.json" val people = sqlContext.read.json(path) // 打印 DataFrame 的元信息 people.printSchema()
// 查看前五条数据 people.show(5)
因为没有这个文件及内容。所以现在创建。
有两种方法,方法一
然后上传上去。
通过hdfs 的命令,将上传的文件,再传到 hdfs 磁盘里面
方法二。是用追加的方式。
上传完到hdfs后,可以进行解析了。
目前还是没有正确读取。将格式改为如下
下面就是正确的解析得到的内容
4 、DataFrame/SQL 计算结果
// 得到 年龄在 13 ~ 19 之间的人的姓名 val teensOne = people.where("age >= 13 and age <=19").select("name") teensOne.show(3) (这个是sprak中API的方式)
// 将 DataFrame 注册为临时表 (这个是通过SQL的方式) people.registerTempTable("people") // 通过 SQL 语句来计算任务 val teensTwo = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19") teensTwo.show(3)
用API的方式:
用sql的方式:
5、RDD与DataFrame的互相转换
RDD转DataFrame
// 创建一个 RDD val people = sc.textFile("file:///home/aboutyun/examples/src/main/resources/people.txt")
people.show(5) 如下所示,先将文件转为一个rdd
方法一:
// 定义 schema 字符串 val schemaString = "name age"
// 生成 schema val schema = StructType( schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))
// 转换 RDD 类型为 Row val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))
// RDD => DataFrame val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)
方法二:
// 定义 schema 字符串 import sqlContext.implicits._
// 定义一个 case 类 case class Person(name: String, age: Int)
// RDD => DataFrame val peopleDataFrame = people.map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
DataFrame转RDD
// DataFrame => RDD val peopleRdd = peopleDataFrame.rdd
但是转换时候报错了
字段类型错误。
3. 掌握 Spark Streaming 编程