一、实验目的
(1)通过实验掌握Spark SQL的基本编程方法;
(2)熟悉RDD到DataFrame的转化方法;
(3)熟悉利用Spark SQL管理来自不同数据源的数据。
二、实验平台
操作系统:Ubuntu16.04
Spark版本:2.4.0
数据库:MySQL
Python版本:3.4.3
三、实验过程
Spark中级编程实践
将sakila的相关表rental导入到MySQL数据库中;
采用Spark编程实现下列操作:
- 查询所有数据,并保存成为文本文件;
在windows中使用navicat转储rental表的结构和数据,将sql文件存入虚拟机,在mysql中使用语句:SOURCE /usr/local/rental.sql;导入mysql中,得到表。
使用下面语句展示路径,因为转为txt文件必须到这个路径下。
错误 mysqldump: Got error: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement when executing 'SELECT INTO OUTFILE' 表示由于 MySQL 服务器启用了 --secure-file-priv 选项,限制了 mysqldump 可以写入文件的目录。 这个选项通常用于安全目的,防止MySQL将数据导出到服务器上的任意位置。当启用时,mysqldump 和 LOAD DATA INFILE 等操作只能对 --secure-file-priv 指定的目录中的文件进行操作。 要解决这个问题,您可以采取以下步骤: 确认 --secure-file-priv 的值: 首先,您需要确认 --secure-file-priv 系统的变量值。在MySQL命令行中,使用以下命令: SHOW VARIABLES LIKE 'secure_file_priv'; |
使用下面语句:select * into outfile '/var/lib/mysql-files/outputfile.txt' from rental;。保存为txt文本。
查看结果:
有一个问题是使用语句“hadoop@dblab-VirtualBox:~$ sudo cd /var/lib/mysql-files/ sudo: cd:找不到命令”,因为:
在 Linux 系统中,sudo 命令用于以另一个用户(通常是超级用户,即 root 用户)的权限来执行命令。然而,sudo 不能用于修改当前 shell 的工作目录,因为工作目录是 shell 的一个环境变量,而不是一个需要提升权限才能执行的命令。 要解决您遇到的权限问题,您应当使用 sudo 来执行涉及 /var/lib/mysql-files/ 目录的相关命令,而不是尝试用 sudo cd。以下是一些您可以使用的命令: 列出目录内容: sudo ls /var/lib/mysql-files/ 查看文件内容: sudo cat /var/lib/mysql-files/outputfile.txt 使用文本编辑器查看或编辑文件: sudo nano /var/lib/mysql-files/outputfile.txt |
查看结果如下:
2.查询所有数据,并去除重复的数据;
使用语句:select dinstinct * from rental;
结果如下:
3.查询所有的rential_id,rental_date,inventory_id,customer_id,并保存成为json文件;
使用语句:“select rental_id,rental_date,inventory_id,customer_id into outfile '/var/lib/mysql-files/outputfile.json' from rental;
Query OK, 16044 rows affected (0.01 sec) “
结果如下:
4.筛选出rental_date>2005-05-26 00:00:00的记录;
使用语句:“SELECT * FROM rental WHERE rental_date > '2005-05-26 00:00:00';”
结果如下:
5.将数据按customer_id分组;
使用语句:“SELECT
customer_id,
COUNT(rental_id) AS rental_count,
MIN(rental_date) AS earliest_rental_date,
MAX(rental_date) AS latest_rental_date
FROM rental
GROUP BY customer_id;”
结果如下:
6.将数据按customer_id分组,并统计每个customer_id总的借阅次数;
使用语句:“SELECT customer_id, COUNT(*) AS total_rentals
FROM rental
GROUP BY customer_id;”
结果如下:
7. 将数据按inventory_id分组,并统计每个inventory_id总的借阅次数;
使用语句:“SELECT inventory_id, COUNT(*) AS total_rentals
FROM rental
GROUP BY inventory_id;”
结果如下:
8. 将数据按customer_id和rental_date中的年份分组,并统计每个customer_id在每个年份总的借阅次数;
使用语句:“SELECT customer_id, YEAR(rental_date) AS rental_year, COUNT(*) AS total_rentals
FROM rental
GROUP BY customer_id, rental_year;”
结果如下: