为什么需要SQL?
SQL用于数据统计分析,关系型数据库存储的数量有限制。
云化: 关系型数据库 =》 Hadoop UDF支持原有关系型数据库内置的函数
简单易用,无门槛转行
支持sql的大数据框架:
- Hive: MapReduce/Tez/Spark 原理:hive把SQL 转成了对应的底层作业,不用管转换过程
- Presto:京东用的
- Impala:为了解决hive交互式查询速度慢的问题,impala推荐的文件存储格式是parquet
- Drill
- phoenix
Spark SQL
是Spark的一个子模块,用来处理结构化数据
spark sql不是仅仅写sql
Spark SQL不仅仅是sql,还支持其他外部数据源。
特点:
- 能够在spark中和sql查询无缝对接
- 统一的数据访问,能够连接到统一的外部数据源,可以跨数据源做join
- 能够访问已存在的Hive metastore,UDF
- 能够通过JDBS访问Spark SQL
Spark SQL的使用
SparkSession:整个spark的入口点
整合hive:将 $HIVE_HOME/conf/hive-site.xml 拷贝到 $SPARK_HOME/conf/
报错:
19/05/04 00:51:22 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
19/05/04 00:51:22 WARN Utils: Your hostname, localhost resolves to a loopback address: 127.0.0.1; using 10.9.61.124 instead (on interface eth0)
19/05/04 00:51:22 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
19/05/04 00:51:25 WARN HiveMetaStore: Retrying creating default database after error: Error creating transactional connection factory
javax.jdo.JDOFatalInternalException: Error creating transactional connection factory
at org.datanucleus.api.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:587)
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.freezeConfiguration(JDOPersistenceManagerFactory.java:788)
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.createPersistenceManagerFactory(JDOPersistenceManagerFactory.java:333)
at org.datanucleus.api.jdo.JDOPersistenceManagerFactory.getPersistenceManagerFactory(JDOPersistenceManagerFactory.java:202)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at javax.jdo.JDOHelper$16.run(JDOHelper.java:1965)
at java.security.AccessController.doPrivileged(Native Method)
Caused by: org.datanucleus.store.rdbms.connectionpool.DatastoreDriverNotFoundException: The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.
at org.datanucleus.store.rdbms.connectionpool.AbstractConnectionPoolFactory.loadDriver(AbstractConnectionPoolFactory.java:58)
at org.datanucleus.store.rdbms.connectionpool.BoneCPConnectionPoolFactory.createConnectionPool(BoneCPConnectionPoolFactory.java:54)
at org.datanucleus.store.rdbms.ConnectionFactoryImpl.generateDataSources(ConnectionFactoryImpl.java:238)
... 147 more
解决办法:缺少mysql的jar包
spark-shell --master local[2] --jars /home/hadoop/source/mysql-connector-java-5.1.27.jar
spark-sql 跟 spark-shell的用法相同
用spark的时候 什么时候需要启动hdfs,什么时候不需要?
用spark SQL的时候需要
测试 spark sql
spark.sql("show tables").show
spark.sql("select * from emp").show
外部数据源
访问外面的数据,每一个spar应用程序都是以加载数据开始,以保存作业结束
- spark 1.x 支持jdbc/orc/parquet/csv/avro,文件可以存放在不同的文件系统之上,可以以不同的文件格式存储
- spark 2.x
DataFrame, DataSet, Rdd的区别
https://www.jianshu.com/p/c0181667daa0
val df = spark.read.json("file:///路径") ⇒ 读取json文件
df.printschema => 打印结构信息
df.select("字段名").show()
import spark.implicits._
df.select($"字段名")
df.filter(df("age")>20).show()
分割:
spark.sparkContext.textFile("").map(_.split("\\|").map(...))
排序:
student.sort($"name".desc,$"id".desc) 名字相同按id降序排
stu1.join(stu2, stu1("id") === stu2("id")).show(false)