Spark之SQL高级知识分享一(SQL+DataFrame+functions+DataSet)

1.Spark SQL

1.1 常见的SQL On Hadoop框架
  • hive(及其重要): 最原始的 on hadoop的方案,由facebook贡献;将sql转化为底层MR/Tez/Spark作业;hive的metastore存储了表和库的所有信息,而且他几乎是和所有on hadoop的框架通用的,hive 2.x.x版本速度上有了很大的提升
  • impala(生产上很少用):可以使用hive的metastore,它推荐的数据格式是 parquet,故我们可以通过spark sql将文本格式等数据转换为parquet格式
  • presto(生产上很少用):facebook出产,JD用的最多
  • shark(淘汰):spark sql的前生,将sparksql 转换为RDD进行操作,已经舍弃
  • drill(生产上很少用):可以用sql操作Habse、hdfs、s3、hive、等各种不同组件上的数据
  • phoenix(重要):架构在HBase之上的一种查询组件、(必选)可以用sql查询Hbase数据,也支持与spark、hive、kafka交互等,如引入phoenix-spark相关jar包后spark可读取phoenix数据以及存储数据到phoenix上,可在github.com/apache/phoenix 查看
  • Spark SQL(及其重要) :是spark的一个模块,用于处理结构化数据,它相较于RDD,底层自己会做一些优化。

Hive、impala、prestore、spark sql 它们都是能共用一套MetaStore,故它们互相间的计算访问或迁移是非常简单的,没有任何壁垒。

1.2 Spark SQL的一些误区
  • 1)spark sql就是写sql!完全片面的观念,它是通过sql、DataFrame、DataSet来处理结构化的数据
  • 2)hive on spark就是spark sql!完全错误的观念,两个是完全不同的观念,完全不是同一个东西。
1.3 spark sql 的版本历史
  • Shark:1.0之后被废弃
  • Spark SQL诞生版本:1.0
  • Spark SQL正式版本:1.3版本,此版本中推出了DataFrame,取代了原有的SchemaRDD
  • Spark SQL DataSet 诞生:1.6版本,它更加的强约束,

2.SQL

2.1 SQL

Spark SQL和hive的sql语法几乎没有任何区别,主要用于查询数据,这里省略讲解。而且生产上代码应多使用DF和DS的API避免直接使用SQL,因为一般做的是平台,是针对用户的WEB UI上的SQL进行API封装,其次SQL不能让错误在编译时提前发现,SQL写错了,也是申请到资源后Executor运行时报错,并不友好

2.2 (重要)SQL Combiner Hive

由于Spark SQL与Hive可以共用一套Metastore,故Spark SQL可通过hive的MetaStore来访问操作hive上的数据(会Spark SQL后Hive是真的可以被彻底放弃了)。

  • 第一步:将hive-site.xml文件拷贝到Spark的conf目录下即可。
  • 第二步:将mysql的jdbc jar通过–jar 以及–dirver-class传给spark,注意虽然可cp jar到lib目录下但是会使所有的作业生效,这样会影响别人不可取,可通过Spark UI查看相关的jars。
  • 通过spark-shell脚本操作hive
[hadoop@hadoop001 ~]$  spark-shell --master local[2]  --jars ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar  --driver-class-path  ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
scala> spark.sql("use wsktest").show()
scala> spark.sql("show tables").show()
  • 通过spark-sql脚本操作hive
[hadoop@hadoop001 ~]$ ~/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/bin/spark-sql --jars ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar  --driver-class-path  ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
spark-sql> use wsktest;
spark-sql> show tables;
  • 通过Spark的beeline操作hive
# 首先启动thrift服务
[hadoop@hadoop001 ~]$  ~/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/sbin/start-thriftserver.sh   --jars ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar  --driver-class-path  ~/app/hive-1.1.0-cdh5.7.0/lib/mysql-connector-java-5.1.47.jar
#使用Beeline
[hadoop@hadoop001 ~]$ ~/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/bin/beeline -u jdbc:hive2://hadoop001:10000/default -
Beeline version 1.2.1.spark2 by Apache Hive
0: jdbc:hive2://hadoop001:10000/default> use wsktest;show tables;

3.RDD and DataSet and DataFrame关系

  • RDD很多高级函数操作(map、fileter、sort等) DataSet、DataFrame都会有
  • RDD[T],spark 并不知道T的具体结构,而DataSet、DataFrame,spark会了解其结构
  • DataFrame ==DataSet[Row]、DataFrame=RDD+Schema
  • DataSet 、 DataFrame可直接通过**.rdd**转换为RDD
  • DataSet 通过.toDF即可转化为df&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值