使用Zeppelin编写Spark读取CSV文件,统计结果并存放Mysql

在我们机器上编写一个CSV文件:

[hadoop@Master spark]$ vi data.csv

内容:大区,名称,充值金额
c,u9,168
c,u7,81
b,u2,124
c,u2,154
a,u5,75
b,u2,97
a,u4,162
c,u10,145
b,u3,25
d,u9,165
b,u8,19
d,u9,130
b,u10,183
d,u10,126
a,u3,114
d,u9,46
b,u4,111
d,u10,12
a,u4,47
b,u7,91
c,u6,71
a,u7,134
c,u1,151
d,u6,124
d,u3,115
a,u3,100
d,u5,137
c,u2,31
b,u5,103
d,u7,112
a,u10,81
a,u4,89
d,u3,20
c,u5,132
d,u2,79
b,u5,123
d,u2,61
d,u3,110
b,u6,132
d,u10,44
a,u6,124
a,u1,47
a,u2,195
a,u10,194
a,u6,85
c,u5,144
c,u10,90
b,u7,134
a,u4,141
d,u9,18
c,u9,137
c,u7,108
c,u7,199
b,u8,166
c,u10,157
b,u2,20
a,u5,58
c,u8,40

有了这些数据之后,我们需要去Mysql中创建数据库和表:

mysql> create database spark_demo;
Query OK, 1 row affected (0.07 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| abc                |
| egdb               |
| hive_metadata      |
| mysql              |
| performance_schema |
| spark_demo         |
| sys                |
+--------------------+
8 rows in set (0.02 sec)

创建表:

表名:tb_record(大区充值记录表)

设置主键:primary key

设置自增:auto_increment

大区名:servername

玩家名:username

金额:money

mysql> use spark_demo
Database changed
mysql> create table tb_record(id int auto_increment primary key,servername varchar(50),username varchar(5),money int)
    -> ;
Query OK, 0 rows affected (0.08 sec)

mysql> select * from tb_record;
Empty set (0.06 sec)


这里笔者用的工具使Zeppelin,需要启动hdfs

read:读取文件,例如csv json,自动产生列名,file:你存放文件的路径

printSchema:查看

%spark
val df =spark.read.csv("file:////home/hadoop/spark/data.csv")
df.printSchema

df: org.apache.spark.sql.DataFrame = [_c0: string, _c1: string ... 1 more field]
root
 |-- _c0: string (nullable = true)
 |-- _c1: string (nullable = true)
 |-- _c2: string (nullable = true)

 我们需要把_c2数据类型改成int,因为money是Int类型的,这里现在是String类型

withColumn:选择列

cast:转换成什么

%spark
import org.apache.spark.sql.types._
import org.apache.spark.sql.functions

val df2 =df.withColumn("_c2",$"_c2".cast(IntegerType))

df2: org.apache.spark.sql.DataFrame = [_c0: string, _c1: string ... 1 more field]

随后将df2注册成一张临时表,将数据暂时存储:

createOrReplaceTempView:临时表

然后通过sql查询,并将_c0(大区)排序 _c2起别名为money,并排序

df3前面必须要加val,否则报错未定义

使用方式为两种:

JavaApi和spark sql,我们使用的是spark sql

%spark
df2.createOrReplaceTempView("tb_tmp1")
val df3 =spark.sql("select _c0,_c1,sum(_c2) as money from tb_tmp1 group by _c0,_c1 order by _c0 asc,money desc")
df3.show(10)

df3: org.apache.spark.sql.DataFrame = [_c0: string, _c1: string ... 1 more field]
+---+---+-----+
|_c0|_c1|money|
+---+---+-----+
|  a|u10|14824|
|  a| u6|14436|
|  a| u5|14276|
|  a| u8|13203|
|  a| u4|13124|
|  a| u1|12721|
|  a| u7|12718|
|  a| u2|12534|
|  a| u3|12399|
|  a| u9|11598|
+---+---+-----+
only showing top 10 rows

由上图所见,我们现在已经将数据查出并排序好,开始将数据save到mysql数据库中,

使用:Spark SQL 中的Save Mode

列举Save Mode的几种用法:三种模式如下:
SaveMode.Append 如果表已经存在,则追加在该表中;若该表不存在,则会先创建表,再插入数据;
SaveMode.Overwrite 重写模式,其实质是先将已有的表及其数据全都删除,再重新创建该表,最后插入新的数据;
SaveMode.Ignore 若表不存在,则创建表,并存入数据;在表存在的情况下,直接跳过数据的存储,不会报错;

%spark
df3.write.mode("overwrite").format("jdbc").option("driver","com.mysql.jdbc.Driver").option("user","root").option("password","Swt123!@#").option("url","jdbc:mysql://localhost:3306/spark_demo").option("dbtable","tb_record").save()

这里如果发现因为没有Mysql驱动报错的话,我们需要去找一个驱动然后放在spark文件下jar文件内

放入mysql驱动后,我们需要重新刷新zeppelin ,否则发现还是缺少mysql驱动

[hadoop@Master jars]$ ll | grep mysql
-rw-rw-r-- 1 hadoop hadoop   983911 12月  2 2015 mysql-connector-java-5.1.38.jar

直到运行无报错后,我们去Mysql查看数据是否保存进去


mysql> select * from tb_record;
+------+------+-------+
| _c0  | _c1  | money |
+------+------+-------+
| a    | u10  | 14824 |
| a    | u6   | 14436 |
| a    | u5   | 14276 |
| a    | u8   | 13203 |
| a    | u4   | 13124 |
| a    | u1   | 12721 |
| a    | u7   | 12718 |
| a    | u2   | 12534 |
| a    | u3   | 12399 |
| a    | u9   | 11598 |
| b    | u4   | 14308 |
| b    | u9   | 14294 |
| b    | u7   | 13994 |
| b    | u8   | 13559 |
| b    | u3   | 13242 |
| b    | u5   | 12967 |
| b    | u6   | 12894 |
| b    | u2   | 12705 |
| b    | u10  | 12308 |
| b    | u1   | 11266 |
| c    | u1   | 14933 |
| c    | u8   | 14652 |
| c    | u6   | 14125 |
| c    | u9   | 13855 |
| c    | u5   | 13739 |
| c    | u4   | 13635 |
| c    | u7   | 13428 |
| c    | u3   | 12649 |
| c    | u10  | 12503 |
| c    | u2   | 11556 |
| d    | u2   | 14540 |
| d    | u7   | 14381 |
| d    | u1   | 13897 |
| d    | u10  | 13730 |
| d    | u3   | 13673 |
| d    | u6   | 13178 |
| d    | u4   | 11873 |
| d    | u9   | 11773 |
| d    | u8   | 11679 |
| d    | u5   | 11016 |
+------+------+-------+
40 rows in set (0.09 sec)

如上图所见,我们已经将数据保存到了Mysql数据库中了。

你可能感兴趣的:(Spark)