大数据学习36:spark-core 和 spark-sql 学习

来源:互联网 发布:华策招聘 知乎 编辑:程序博客网 时间:2024/06/04 17:41
一、spark-core:
使用spark core 需要定义一个sparkConf ,再将 sparkConf 传入 SparkContext 获得一个 sc 实例。
val sparkConf = new SparkConf().setAppName( "Broadcast" ).setMaster( "local[3]" )
val sc = new SparkContext( sparkConf )

在定义一些函数,要使用到 sc ,需要将 sc 作为入参传入,
def commonJoin(sc: SparkContext): Unit = {
....
}

shell启动spark 运行
spark-shell --master local[2] --name "wxk"
val dataFile = sc.textFile("file:///root/data/sample_age_data.txt")
//1、取出年龄
val ageData = dataFile.map(x => x.split(" ")(1))
//2、求人数
val count = dataFile.count()
//3、年龄相加/人数
val totalage = ageData.map(age => age.toInt).reduce(_ + _)
val aveAge = totalage / count

用spark-submit 作业
spark-submit \
--class com.wxk.spark.AvgAgeCalculatorApp \
--master local[2] \
--name "wxk1" \
/root/spark-test/spark-train-1.0.jar 

带有入参的spark-submit 作业
object WorldcountApp {
  def main(args: Array[String]) {
    val sparkConf = new SparkConf()
    val sc = new SparkContext(sparkConf)
// 这里可以传入一个入参
    val textFIle = sc.textFile(args(0),1)
    val wc = textFIle.flatMap(line => line.split("\t")).map((_, 1))
      .reduceByKey(_ + _)
    //wc.collect().foreach(println)
    val sorted = wc.map(x => (x._2, x._1)).sortByKey(false).map(x => (x._2, x._1))
sorted.max
    sorted.saveAsTextFile(args(1))
    sc.stop()
  }
}
打包后:
spark-submit \
--class  com.wxk.spark.WorldcountApp \
--master local[3] \
/root/spark-test/spark-train-1.0.jar \
hdfs://192.168.137.12:8020/sparktest/wc/wxkinput.txt  \
hdfs://hadoop002:8020/sparktest/wc-output

二、spark-sql:
需要先将hive 中的 hive-site.xml 拷贝到 /opt/software/spark-2.2.0-bin-2.6.0-cdh5.7.0/conf 下
通过idea 使用:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().master( "local[3]" ).appName( "IPScount" ).getOrCreate()
调用方法需要传入 spark session 参数
runUDFIPScount( spark )
private def runUDFIPScount(spark: SparkSession): Unit = {
    这里需要导入隐式转换和spark.sql.functions._ 
import spark.implicits._
    import org.apache.spark.sql.functions._
.....
}

通过spark-shell 用法:
spark-shell --master local[2] --jars /root/mysql-connector-java-5.1.27-bin.jar 
spark.sql("show tables ").show 
scala> spark.sql("show tables").show
+--------+--------------------+-----------+
|database|           tableName|isTemporary|
+--------+--------------------+-----------+
| default|                   a|      false|
| default|                dept|      false|
| default|                 emp|      false|
| default|          mid_shipin|      false|
| default|          page_views|      false|
| default|      page_views_orc|      false|
| default| page_views_orc_none|      false|
| default|  page_views_parquet|      false|
| default|page_views_parque...|      false|
| default|page_views_parque...|      false|
| default|       page_views_rc|      false|
| default| page_views_reduce_3|      false|
| default|page_views_reduce...|      false|
| default|      page_views_seq|      false|
| default|   page_views_snappy|      false|
| default|       shipin_origin|      false|
+--------+--------------------+-----------+

连接的库是通过 hive-site.xml 创建的,通过拷贝hive的文件到spark conf 下,所以spark sql 和 hive 公用一套元数据

Spark-sql 用法:
spark-sql  --master local[2]  --jars /root/mysql-connector-java-5.1.27-bin.jar 
spark-sql (default)> select * from emp;
7369    SMITH   CLERK   7902    1980-12-17      800.0   NULL    20
7499    ALLEN   SALESMAN        7698    1981-2-20       1600.0  300.0   30
7521    WARD    SALESMAN        7698    1981-2-22       1250.0  500.0   30
7566    JONES   MANAGER 7839    1981-4-2        2975.0  NULL    20
7654    MARTIN  SALESMAN        7698    1981-9-28       1250.0  1400.0  30
7698    BLAKE   MANAGER 7839    1981-5-1        2850.0  NULL    30
7782    CLARK   MANAGER 7839    1981-6-9        2450.0  NULL    10
7788    SCOTT   ANALYST 7566    1987-4-19       3000.0  NULL    20
7839    KING    PRESIDENT       NULL    1981-11-17      5000.0  NULL    10
7844    TURNER  SALESMAN        7698    1981-9-8        1500.0  0.0     30
7876    ADAMS   CLERK   7788    1987-5-23       1100.0  NULL    20
7900    JAMES   CLERK   7698    1981-12-3       950.0   NULL    30
7902    FORD    ANALYST 7566    1981-12-3       3000.0  NULL    20
7934    MILLER  CLERK   7782    1982-1-23       1300.0  NULL    10

spark 的默认压缩格式可以在 /opt/software/hadoop/etc/hadoop/mapred-site.xml 配置。
<property>
        <name>mapreduce.output.fileoutputformat.compress</name>
        <value>true</value>
</property>


<property>
        <name>mapreduce.output.fileoutputformat.compress.codec</name>
        <value>org.apache.hadoop.io.compress.BZip2Codec</value>
</property>

spark 中指定压缩格式:
bzip2
压缩率最高,压缩解压速度较慢,支持split。
import org.apache.hadoop.io.compress.BZip2Codec
rdd.saveAsTextFile("codec/bzip2",classOf[BZip2Codec])

snappy
json文本压缩率 38.2%,压缩和解压缩时间短。
import org.apache.hadoop.io.compress.SnappyCodec
rdd.saveAsTextFile("codec/snappy",classOf[SnappyCodec])

gzip
压缩率高,压缩和解压速度较快,不支持split,如果不对文件大小进行控制,下次分析可能可能会造成效率低下的问题。 
json文本压缩率23.5%,适合使用率低,长期存储的文件。
import org.apache.hadoop.io.compress.GzipCodec
rdd.saveAsTextFile("codec/gzip",classOf[GzipCodec])
-----------------------------
parquet文件压缩
parquet为文件提供了列式存储,查询时只会取出需要的字段和分区,对IO性能的提升非常大,同时占用空间较小,即使是parquet的uncompressed存储方式也比普通的文本要小的多。
spark中通过sqlContext.write.parquet("path") 
对parquet文件进行存储,默认使用的gzip压缩方式。
可以通过spark.sql.parquet.compression.codec参数或是在代码中进行修改。
parquet存储提供了lzo,gzip,snappy,uncompressed四种方式。
阅读全文
0 0
原创粉丝点击