转载请标明出处http://www.cnblogs.com/haozhengfei/p/22bba3b1ef90cbfaf073eb44349c0757.html
Spark_总结四
1.Spark SQL
Spark SQL 和 Hive on Spark 两者的区别?
spark on hive:hive只是作为元数据存储的角色,解析,优化,执行都是spark做的
hive on spark: hive既作为存储的角色,又作为计算角色的一部分,hive将sql解析Spark任务,底层是Spark引擎(hive2.0以后推荐使用Spark引擎,转化为Spark任务,hvie2.0以前都是转化为MR任务)
Spark SQL 转化的过程(底层架构)
【SQL/HQL-->解析器-->分析器-->优化器-->CostModel消耗模型(选出消耗最低的,就是效率最高的),最终将传入的SQL转换为RDD的计算】
须知:
若想使用SparkSQL必须创建SQLContext 必须是传入SparkContext 不能是SparkConf
1.DataFrame与RDD的区别? || 什么是DataFrame?
区别:
Spark core是基于RDD的编程,Spark SQL是基于DataFrame的编程,DataFrame的底层就是封装的RDD,只不过DataFrame底层RDD的泛型是ROW(DataFrame <==> RDD<ROW>),另外,DataFrame中有对列的描述,但是RDD没有对列的描述。
What is DataFrame:
DataFrame 与 RDD 类似,DataFrame 是一个分布式数据容器,更像传统数据库的二维表格,除了数据以外,还掌握数据的结构信息(比如对列的描述), 即 schema。同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、 array 和 map)。 从 API 易用性的角度上 看,DataFrameAPI 提供的是一套高层的关系操作,比函数式的 RDDAPI 要更加友好,门槛更低。
3.创建DataFrame的来源和方式 || 如何对DataFrame中封装的数据进行操作?
3.1创建DataFrame的来源和方式
3.2如何对DataFrame中封装的数据进行操作?
当我们的DataFrame构建好之后,里面封装了我们的数据,需要对数据进行操作即对DataFrame进行操作,有两种方式
3.2.1 通过方法
sqlContext.read() 返回DataFrameReader对象
sqlContext.read().json("student.json") 读取一个json文件(这个json文件中的内容不能是嵌套的)读进来变成DataFrame,
df.select("age").show(),如果没有show,这个程序就不会执行,这个show就类似与Spark中Action类型的算子,触发执行
示例代码:
1 package com.hzf.spark.exercise; 2 3 import org.apache.spark.SparkConf; 4 import org.apache.spark.api.java.JavaSparkContext; 5 import org.apache.spark.sql.DataFrame; 6 import org.apache.spark.sql.SQLContext; 7 8 public class TestSparkSQL { 9 public static void main(String[] args) { 10 SparkConf conf = new SparkConf().setAppName("DataFrameOps").setMaster("local"); 11 12 JavaSparkContext sc = new JavaSparkContext(conf); 13 SQLContext sqlContext = new SQLContext(sc); 14 15 DataFrame df = sqlContext.read().json("people.json"); 16 17 18 /* 19 * 操作DataFrame的第一种方式 20 * */ 21 //类似 SQL的select from table; 22 df.show(); 23 //desc table 24 df.printSchema(); 25 26 //select age from table; 27 df.select("age").show(); 28 //select name from table; 29 df.select("name").show(); 30 //select name,age+10 from table; 31 df.select(df.col("name"),df.col("age").plus(10)).show(); 32 //select * from table where age > 20 33 df.filter(df.col("age").gt(20)).show(); 34 } 35 }