大数据实践(十) Spark多种开发语言、与Hive集成

Spark 可以使用scala、Java、Sql、Python、R语言进行开发。

在bin目录下也提供了spark-shell、spark-sql、sparkR、pyspark等交互方式。

SparkSQL实现了Hive的模型、Hive在新版本中也建议使用Spark作为计算引擎。

一、Spark实现wordCount(TopK)

使用以下文本进行词频统计。

Java hadoop Spark  \Hbase
Spark hadoop Java 
hive mysql
hadoop Spark hive	ClickHouse
Spark Flink hadoop
Java scala hadoop
Spark hadoop Java,hadoop
0、HiveQL/SparkSQL

在hive中就是写sql,然后转换为MR。现在Hive已经建议使用Spark\Tez等作为计算引擎。

hive命令行和spark-sql命令行都是写sql,语句基本一样。

Spark bin目录下也有sparkR工具可以使用,和这种方式基本一样,就是写SQL.

select t.word word,count(word) as count from (select explode(split(name,'\\s+')) as word from sparkdemotable) t group by word;

--hive beeline命令行
+-----------------+--------+
|      word       | count  |
+-----------------+--------+
|                 | 1      |
| Flink           | 1      |
| Hbase           | 1      |
| Java            | 3      |
| Java,hadoop     | 1      |
| Spark           | 5      |
| hadoop          | 6      |
| hive            | 1      |
| hiveClickHouse  | 1      |
| mysql           | 1      |
| scala           | 1      |
+-----------------+--------+
11 rows selected (2.162 seconds)



--求topkey也很方便,写sql就行
select t.word word,count(word) as count from (select explode(split(name,'\\s+')) as word from sparkdemotable) t group by word order by count desc limit 3;

+---------+--------+
|  word   | count  |
+---------+--------+
| hadoop  | 6      |
| Spark   | 5      |
| Java    | 3      |
+---------+--------+
3 rows selected (3.122 seconds)

1、Scala

Scala开发Spark比较方便快捷。

在交互式环境下连接到HDFS,使用RDD进行词频统计、排序。

scala> var res=sc.textFile("hdfs://192.168.x.x:9000/hadoop/SparkDemo.txt")
res: org.apache.spark.rdd.RDD[String] = hdfs://192.168.x.x:9000/hadoop/SparkDemo.txt MapPartitionsRDD[15] at textFile at <console>:24

scala> var line=res.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_)
line: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[18] at reduceByKey at <console>:25


scala> line.foreach(println)
(hive,1)
(mysql,1)
(hello,1)
(java,2)
(spark,2)
(hadoop,2)


//所有参数都可以显式指定
  def main(args: Array[String]): Unit = {

    val conf:SparkConf=new SparkConf().setAppName(s"${args(0)}")
      .setMaster("local[3]") //提交到Spark中,这个参数就不要了
    val sparkContext = new SparkContext(conf)

    val lines: RDD[String] = sparkContext.textFile(s"${args(1)}")

    val text=lines.flatMap(_.split("\\s+")).map(_.toUpperCase).map((_,1)).reduceByKey((_+_))

    text.map(_.swap).sortByKey(ascending = false).map(_.swap).take(3).foreach(println)

  }
2、 Python

pyspark是Spark的Python实现,api基本和scala版本一样。

在bin目录下也可以直接使用pyspark进行python编程(需要有python环境)。

>>> text=sc.textFile('/usr/local/SparkDemo.txt')

>>> text.first()
'java hadoop spark'                                                             

>>> lines=text.flatMap(lambda line:line.split(' '))
>>> line=lines.map(lambda x:(x,1)).reduceByKey(lambda a,b:a+b)

>>> line.collect()
[('java', 3), ('hadoop', 5), ('hive', 2), ('Spark', 2), ('Flink', 1), ('scala', 1), ('spark', 2), ('hello', 1), ('mysql', 1), ('SparkHadoopJava', 1)]
                       
>>> line.foreach(lambda t:print(t))
('spark', 2)
('hello', 1)
('mysql', 1)
('SparkHadoopJava', 1)
('java', 3)
('hadoop', 5)
('hive', 2)
('Spark', 2)
('Flink', 1)
('scala', 1)
>>> 


#写在文件中
from pyspark import SparkContext
from pyspark.sql.session import SparkSession


# conf = SparkConf().setAppName('test_parquet')
sc = SparkContext('local[6]', 'test')
# spark = SparkSession(sc)
# sc.setLogLevel("INFO")

text = sc.textFile(name ="wordcount.txt")
import re

#压扁、分割、聚合
word = text.flatMap(lambda x:re.split("\\W+", x)).map(lambda x:(x, 1)).reduceByKey(lambda a, b: a + b)

#收集
top = word.collect()

print(top)

sc.stop()

3、Java

在Java中写wordCount,有Java8的函数式编程支持,写起来还好。

public static void main(String[] args) {

        SparkConf conf = new SparkConf();

        //wordCount local[3]  dir/wordcount.txt
        conf.setAppName(args[0]).setMaster(args[1]);

        //转换成Java上下文
        JavaSparkContext sC = new JavaSparkContext(conf);

        //读取文件
        JavaRDD<String> rdd = sC.textFile(args[2]);

        //压扁,分割,要返回迭代器
        JavaRDD<String> javaRDD = rdd.flatMap(lines -> Stream.of(lines.split("\\W+")).iterator()).
                map(String::toUpperCase);//转大写


//        JavaPairRDD<String, Integer> mapRDD = javaRDD.mapToPair(new PairFunction<String, String, Integer>() {
//
//            @Override
//            public Tuple2<String, Integer> call(String s) throws Exception {
//                return new Tuple2<String, Integer>(s, 1);
//            }
//        });

        //转成元组,(word,1)的格式
        JavaPairRDD<String, Integer> mapRDD = javaRDD.mapToPair(w -> Tuple2.<String, Integer>apply(w, 1));

        //求和
        JavaPairRDD<String, Integer> reduceRDD = mapRDD.reduceByKey(Integer::sum);

        //交换、排序,取TopK
        List<Tuple2<String, Integer>> topK = reduceRDD.map(Tuple2::swap).sortBy(Tuple2::_1, false, 2).
                map(Tuple2::swap).take(3);

        //打印
        topK.forEach(System.out::println);

        sC.stop();

    }

二、Spark操作Hive

Spark操作hive:

1、将hive中conf目录下的hive-site.xml移动Spark的conf目录下。
2、spark执行命令中加入数据库驱动
	#如果报错,将jars换成--driver-class-path
	spark-shell --master local[2] --jars /usr/local/hive/lib/mysql-connector-java-8.0.20.jar
3、hdfs要启动,即使是Spark本地模式,但是hive的数据是在Hdfs中的。

spark-shell中使用Spark的api进行操作,pyspark的api一样。

#启动Spark-shell命令行,使用sparkSQL的api操作hive
spark-shell --master local[2] --driver-class-path /usr/local/hive/lib/mysql-connector-java-8.0.20.jar

scala> spark.sql("select count(name),name from sparkdemotable group by name").show()
+-----------+--------------------+                                              
|count(name)|                name|
+-----------+--------------------+
|          1|     SparkHadoopJava|
|          1|spark hadoop java...|
|          1|   java scala hadoop|
|          1|          hive mysql|
|          1|   hadoop Spark hive|
|          1|  Spark Flink hadoop|
|          2|   java hadoop spark|
+-----------+--------------------+

spark-sql中就是写sql,方式和hive中一样

#启动spark-sql命令行,使用sql的方式操作hive
>>spark-sql  --driver-class-path /usr/local/hive/lib/mysql-connector-java-8.0.20.jar

select * from sparkdemotable;

java hadoop spark
java hadoop spark
spark hadoop java hello
hive mysql
hadoop Spark hive
Spark Flink hadoop
java scala hadoop
SparkHadoopJava

#两种方式出来的数据格式都不一样,
#方式一好快啊,方式二慢了许多,底层应该都是一样的RDD
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整全套资源下载地址:https://download.csdn.net/download/qq_27595745/65977804 【完整课程列表】 大数据与云计算教程课件 优质大数据课程 01.Hadoop简介与安装入门(共29页).pptx 大数据与云计算教程课件 优质大数据课程 02.MapReduce(共23页).pptx 大数据与云计算教程课件 优质大数据课程 03.Hadoop YARN(共25页).pptx 大数据与云计算教程课件 优质大数据课程 04.MapReduce Eclipse开发插件(共20页).pptx 大数据与云计算教程课件 优质大数据课程 05.Hadoop入门数据分析实战(共57页).pptx 大数据与云计算教程课件 优质大数据课程 06.HDFS(共38页).pptx 大数据与云计算教程课件 优质大数据课程 07.HDFS Shell命令(共21页).pptx 大数据与云计算教程课件 优质大数据课程 08.HDFS文件接口(共41页).pptx 大数据与云计算教程课件 优质大数据课程 09.MapReduce序列化(共29页).pptx 大数据与云计算教程课件 优质大数据课程 10.MapReduce MP过程进阶(共42页).pptx 大数据与云计算教程课件 优质大数据课程 11.MapReduce IO操作(共61页).pptx 大数据与云计算教程课件 优质大数据课程 12.序列化框架(共28页).pptx 大数据与云计算教程课件 优质大数据课程 13.深入MapReduce应用开发(共21页).pptx 大数据与云计算教程课件 优质大数据课程 14.Hadoop集群配置(共6页).pptx 大数据与云计算教程课件 优质大数据课程 15.Hive(共46页).pptx 大数据与云计算教程课件 优质大数据课程 16.Hive操作(共43页).pptx 大数据与云计算教程课件 优质大数据课程 17.Hive查询(共32页).pptx 大数据与云计算教程课件 优质大数据课程 18.HBase(共43页).pptx 大数据与云计算教程课件 优质大数据课程 19.Pig(共33页).pptx 大数据与云计算教程课件 优质大数据课程 20.Pig Latin(共36页).pptx 大数据与云计算教程课件 优质大数据课程 21.Pig模式与函数(共64页).pptx 大数据与云计算教程课件 优质大数据课程 22.Zookeeper(共28页).pptx 大数据与云计算教程课件 优质大数据课程 23.Zookeeper服务(共47页).pptx 大数据与云计算教程课件 优质大数据课程 24.使用Zookeeper构建应用(共34页).pptx 大数据与云计算教程课件 优质大数据课程 25.Sqoop(共19页).pptx 大数据与云计算教程课件 优质大数据课程 26.深入Sqoop的导入(共29页).pptx 大数据与云计算教程课件 优质大数据课程 27.深入Sqoop导出(共19页).pptx 大数据与云计算教程课件 优质大数据课程 28.Flume(共33页).pptx 大数据与云计算教程课件 优质大数据课程 29.Kafka(共30页).pptx 大数据与云计算教程课件 优质大数据课程 30.Kafka开发(共34页).pptx 大数据与云计算教程课件 优质大数据课程 31.Strom(共14页).pptx 大数据与云计算教程课件 优质大数据课程 32.Spark入门之Scala(共173页).pptx 大数据与云计算教程课件 优质大数据课程 33.Spark入门(共40页).pptx 大数据与云计算教程课件 优质大数据课程 34.SparkSQL(共15页).pptx 大数据与云计算教程课件 优质大数据课程 35.Oozie(共41页).pptx 大数据与云计算教程课件 优质大数据课程 36.Impala(共20页).pptx 大数据与云计算教程课件 优质大数据课程 37.Solr(共38页).pptx 大数据与云计算教程课件 优质大数据课程 38.Lily(共23页).pptx 大数据与云计算教程课件 优质大数据课程 39.Titan(共20页).pptx 大数据与云计算教程课件 优质大数据课程 40.Neo4j(共50页).pptx 大数据与云计算教程课件 优质大数据课程 41.Elasticsearch(共17页).pptx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值