文章目录
- 一、实现任务
- 1、准备数据文件
- 2、创建Maven项目
- 3、修改源程序目录
- 4、添加依赖和设置源程序目录
- 5、创建日志属性文件
- 6、创建HDFS配置文件
- 7、创建词频统计单例对象
一、实现任务
1、准备数据文件
- 在
/home
目录创建words.txt
hello scala world
hello spark world
scala is very concise
spark is very powerful
let us learn scala and spark
we can learn them well
- 上传单词文件到HDFS指定目录
hdfs dfs -mkdir p /wordcount/input
hdfs dfs -put words.txt /wordcount/input
2、创建Maven项目
- 创建Maven项目 -
SparkSQLWordCount
3、修改源程序目录
4、添加依赖和设置源程序目录
- 在pom.xml文件里添加依赖和设置源程序目录
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>net.huawei.sql</groupId>
<artifactId>SparkSQLWordCount</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.15</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.12</artifactId>
<version>3.1.3</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
</build>
</project>
5、创建日志属性文件
- 在resources目录里创建
log4j.properties
文件
log4j.rootLogger=ERROR, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spark.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
6、创建HDFS配置文件
- 在resources目录里创建
hdfs-site.xml
文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<description>only config in clients</description>
<name>dfs.client.use.datanode.hostname</name>
<value>true</value>
</property>
</configuration>
7、创建词频统计单例对象
- 创建
net.xxr.sql
包,在包里创建WordCount
单例对象
package net.xxr.sql
import org.apache.spark.sql.{Dataset, SparkSession}
/**
* 功能:利用Spark SQL实现词频统计
*/
object WordCount {
def main(args: Array[String]): Unit = {
// 创建或得到SparkSession
val spark = SparkSession.builder()
.appName("SparkSQLWordCount")
.master("local[*]")
.getOrCreate()
// 读取HDFS上的单词文件
val lines: Dataset[String] = spark.read.textFile("hdfs://master:9000/wordcount/input/words.txt")
// 显示数据集lines内容
lines.show()
// 导入Spark会话对象的隐式转换
import spark.implicits._
// 将数据集中的数据按空格切分并合并
val words: Dataset[String] = lines.flatMap(_.split(" "))
// 显示数据集words内容
words.show()
// 将数据集默认列名由value改为word,并转换成数据帧
val df = words.withColumnRenamed("value", "word").toDF()
// 显示数据帧内容
df.show()
// 基于数据帧创建临时视图
df.createTempView("v_words")
// 执行SQL分组查询,实现词频统计
val wc = spark.sql(
"""
| select word, count(*) as count
| from v_words group by word
| order by count desc
|""".stripMargin)
// 显示词频统计结果
wc.show()
// 关闭会话
spark.close()
}
}