一、 概述:
DataFrame是一个分布式数据集,可以理解为关系型数据库一张表,由字段和字段类型、字段值按列组织,且支持四种语言,在Scala API中可以理解为: FataFrame=Dataset[ROW]
注:DataFrame产生于V1.3之后,在V1.3前为SchemaRDD,在V1.6以后又添加了Dataset
二、DataFrame vs RDD 差异:
概念 : 两个都是分布式容器,DF理解是一个表格除了RDD数据以外还有Schema,也支持复杂数据类型(map..)
API : DataFrame提供的API比RDD丰富 支持map filter flatMap .....
数据结构:RDD知道类型没有结构, DF提供Schema信息 有利于优化,性能上好
底层 :基于运行环境不一样,RDD开发的Java/Scala API运行底层环境JVM,
DF在SparkSQL中转换成逻辑执行计划(locaical Plan)和物理执行计划(Physical Plan)中间自身优化功能,性能差异大
三、json文件操作
[hadoop@hadoop001 bin]$./spark-shell --master local[2] --jars ~/software/mysql-connector-java-5.1.34-bin.jar
-- 读取json文件
scala>val df = spark.read.json("file:///home/hadoop/data/people.json")
18/09/02 11:47:20 WARN ObjectStore: Failed to get database global_temp, returning NoSuchObjectException
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
-- 打印schema信息
scala> df.printSchema
root
|-- age: long (nullable = true) -- 字段 类型 允许为空
|-- name: string (nullable = true)
-- 打印字段内容
scala> df.show
+----+-------+
| age| name|
+----+-------+
|null|Michael|
| 30| Andy|
| 19| Justin|
+----+-------+
-- 打印查询字段
scala> df.select("name").show
+-------+
| name|
+-------+
|Michael|
| Andy|
| Justin|
+-------+
-- 单引号,存在隐式转换
scala> df.select('name).show
+-------+
| name|
+-------+
|Michael|
| Andy|
| Justin|
+-------+
-- 双引号隐式转换不识别
scala> df.select("name).show