sparksql学习笔记
wordcount
object xxx{
def main(args:Array[String]){
val sparkConf = new SparkConf().setMaster("local").setAppName("xxx")
val sc = new SparkContext(sparkConf)
val rdd = sc.textFile("xxxx")
rdd.flatmap(_.split(",")).map(word =>(word,1)).reduceByKey(_+_),collect().foreach(println)
//按照单词结果次数降序排
rdd.flatMap(_.split(",")).map(word=>(word,1)).reduceByKey(_+_).map(x =>(x._2,x._1)).sortByKey(false).map(x=>(x._2,x._1))
.saveAsTextFile("file:///Users/dongheng/Desktop/code-ali/studyscala/sparksql-train/src/output")
rdd.flatMap(_.split(",")).map(word=>(word,1)).reduceByKey(_+_).map(x=>(x._2,x_1)).sortByKey(false).map(x=>(x._2,x._1)).collect
sc.stop()
}
}
./spark-shell --master local
打包我们的应用程序,让其运行在local模式下
如何运行jar包呢?
./spark-submit \
--class com.imooc.bigdata.chapter02.SparkWordCountAppV2 \
--master local \
/home/hadoop/lib/sparksql-train-1.0.jar \
file:///home/hadoop/data/wc.data file:///home/hadoop/data/out
如何提交Spark应用程序到YARN上执行
./spark-submit \
--class com.imooc.bigdata.chapter02.SparkWordCountAppV2 \
--master yarn \
--name SparkWordCountAppV2 \
/home/hadoop/lib/sparksql-train-1.0.jar \
hdfs://hadoop000:8020/pk/wc.data hdfs://hadoop000:8020/pk/out
要将Spark应用程序运行在YARN上,一定要配置HADOOP_CONF_DIR或者YARN_CONF_DIR
指向$HADOOP_HOME/etc/conf
local和YARN模式 重点掌握
Standalone 了解
多个机器,那么你每个机器都需要部署spark
相关配置:
$SPARK_HOME/conf/slaves
hadoop000
$SPARK_HOME/conf/spark-env.sh
SPARK_MASTER_HOST=hadoop000
启动Spark集群
$SPARK_HOME/sbin/start-all.sh
jps: Master Worker
./spark-submit \
--class com.imooc.bigdata.chapter02.SparkWordCountAppV2 \
--master spark://hadoop000:7077 \
--name SparkWordCountAppV2 \
/home/hadoop/lib/sparksql-train-1.0.jar \
hdfs://hadoop000:8020/pk/wc.data hdfs://hadoop000:8020/pk/out2
不管什么运行模式,代码不用改变,只需要在spark-submit脚本提交时
通过--master xxx 来设置你的运行模式即可
Spark SQL是什么
Spark SQL is Apache Spark's module for working with structured data.
误区一:Spark SQL就是一个SQL处理框架
1)集成性:在Spark编程中无缝对接多种复杂的SQL
2)统一的数据访问方式:以类似的方式访问多种不同的数据源,而且可以进行相关操作
spark.read.format("json").load(path)
spark.read.format("text").load(path)
spark.read.format("parquet").load(path)
spark.read.format("json").option("...","...").load(path)
3) 兼容Hive
allowing you to access existing Hive warehouses
如果你想把Hive的作业迁移到Spark SQL,这样的话,迁移成本就会低很多
4)标准的数据连接:提供标准的JDBC/ODBC连接方式 Server
Spark SQL应用并不局限于SQL
还支持Hive、JSON、Parquet文件的直接读取以及操作
SQL仅仅是Spark SQL中的一个功能而已
使用spark shell 做sql
//看到视频上直接用spark-shell --master local[2] 我这样报错,必须要用下面的
spark-shell --master local[2] --jars ~/lib/mysql-cr-java-5.1.38.jar
spark.sql("show databases").show
spark-shell启动流程分析
REPL: Read-Eval-Print Loop 读取-求值-输出
提供给用户即时交互一个命令窗口
spark-sql执行流程分析
spark-sql底层调用的也是spark-submit
因为spark-sql它就是一个Spark应用程序,和spark-shell一样
对于你想启动一个Spark应用程序,肯定要借助于spark-submit这脚本进行提交
spark-sql调用的类是org.apache.spark.sql.hive.thriftserver.SparkSQLCLIDriver
spark-shell调用的类是org.apache.spark.repl.Main
R/Pandas 能做数据分析 但是是单机
A Dataset is a distributed collection of data
A DataFrame is a Dataset organized into named columns
以列(列名、列类型、列值)的形式构成的分布式数据集
It is conceptually equivalent to a table in a relational database or a data frame in R/Python
DF = Table ==> SQL
In Scala and Java, a DataFrame is represented by a Dataset of Rows
提供了很多方法的支持
在日常开发过程中,我们使用Spark SQL来进行日志处理(90%)
你要处理一个目录下或者指定文件的日志数据,数据格式是文本类型的
直接使用spark.read.text(path)读进来之后,就是只有一个string类型的名字为value的值
1)uses reflection to infer the schema of an RDD that contains specific types of objects
2)creating Datasets is through a programmatic interface that allows you to construct a schema and then apply it to an existing RDD
对于字段比较少的场景,个人倾向于使用第一种
对于字段比较多的场景,个人倾向于使用第二种,自己灵活定制
编程方式实现的三步曲
1)Create an RDD of Rows from the original RDD;
2)Create the schema represented by a StructType matching the structure of Rows in the RDD created in Step 1.
3)Apply the schema to the RDD of Rows via createDataFrame method provided by SparkSession.