题目
Spark编程
使用Spark编程实现:
(1)wordcount单词计数
(2)有一个文本文件test.txt,里面包含如下数据:
apple,banana,lemen,orange,grape,pear,peach
grape,pear,peach,strawberry,cherry
apple,orange,grape
strawberry,cherry,lemon
orange,grape,pear,apple
要求:
- 找出包含apple的行
- 将包含apple的行按照“,”进行分割,得到一个列表集合
- 将集合中重复的单词去掉
- 将数据存储到本地主目录的 output 目录下
实现
该题,由于实在没能明白出题人的本意要如何,是计数后分割还是如何,因此干脆都写了,仅作参考。
代码实现1: 单词计数
package topic01;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import scala.Tuple2;
import java.util.Arrays;
import java.util.Properties;
public class topic01 {
public static void main(String[] args) {
// 配置 Hadoop 环境变量 使用 HDFS 时有效
Properties properties = System.getProperties();
properties.setProperty("HADOOP_USER_NAME", "root");
// 创建SparkConf和JavaSparkContext
SparkConf conf = new SparkConf();
// 设置应用名称
conf.setAppName("Topic01");
// 设置运行模式
// local:表示在本地单机上以单线程模式运行
// local[*]:表示在本地单机上以多线程模式运行,线程数由系统自动决定
// spark://HOST:PORT:表示连接到指定的 Spark 集群运行
// mesos://HOST:PORT:表示连接到指定的 Mesos 集群运行
// yarn:表示在 YARN 集群上运行
conf.setMaster("local[*]");
// 创建 JavaSpark 上下文对象
JavaSparkContext sc = new JavaSparkContext(conf);
// 读取文本文件 此处提供两种方式, 读取本地方式已被注释
// JavaRDD<String> textFile = sc.textFile("test.txt"); // 读取本地文件
JavaRDD<String> textFile = sc.textFile("hdfs://master1:9000/Tianxidev/word.txt"); // 读取 HDFS 文件系统
// 将每一行按照逗号分割成一个字符串数组
JavaRDD<String> words = textFile.flatMap(line -> Arrays.asList(line.split(",")).iterator());
// 把每个单词映射为键值对 (word, 1)
JavaPairRDD<String, Integer> wordOnes = words.mapToPair(word -> new Tuple2<>(word, 1));
// 对相同键的值进行累加
JavaPairRDD<String, Integer> wordCounts = wordOnes.reduceByKey((a, b) -> a + b);
// 输出计数结果
wordCounts.foreach(pair -> System.out.println(pair._1() + ": " + pair._2()));
// 输出结果到本地主目录的 output 目录下
wordCounts.saveAsTextFile("output"); // 输出本地
wordCounts.saveAsTextFile("hdfs://master1:9000/Tianxidev/output"); // 输出 HDFS 文件系统
// 停止 JavaSparkContext, 释放资源
sc.stop();
}
}
代码实现2: 分割去重
package topic02;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.Arrays;
import java.util.List;
public class topic02 {
public static void main(String[] args) {
// 创建SparkConf和JavaSparkContext
SparkConf conf = new SparkConf();
// 设置应用名称
conf.setAppName("Topic02");
// 设置运行模式
// local:表示在本地单机上以单线程模式运行
// local[*]:表示在本地单机上以多线程模式运行,线程数由系统自动决定
// spark://HOST:PORT:表示连接到指定的 Spark 集群运行
// mesos://HOST:PORT:表示连接到指定的 Mesos 集群运行
// yarn:表示在 YARN 集群上运行
conf.setMaster("local[*]");
// 创建 JavaSpark 上下文对象
JavaSparkContext sc = new JavaSparkContext(conf);
// 读取文本文件 test.txt 文件内容如下注释
// apple,banana,lemen,orange,grape,pear,peach
// grape,pear,peach,strawberry,cherry
// apple,orange,grape
// strawberry,cherry,lemon
// orange,grape,pear,apple
JavaRDD<String> textFile = sc.textFile("test.txt");
// 找出包含apple的行, line.contains 过滤掉不含 apple 的行
JavaRDD<String> appleLines = textFile.filter(line -> line.contains("apple"));
// 将包含apple的行按照 “,” 进行分割得到字符串数组
JavaRDD<String[]> lists = appleLines.map(line -> line.split(","));
// 将集合中重复的单词去掉
JavaRDD<List<String>> words = lists.map(Arrays::asList).distinct();
// 输出结果到本地主目录的output目录下
words.saveAsTextFile("output");
// 停止 JavaSparkContext, 释放资源
sc.stop();
}
}
代码实现3: 合并实现
public static void main(String[] args) {
// 创建SparkConf和JavaSparkContext
SparkConf conf = new SparkConf().setAppName("Word Count");
JavaSparkContext sc = new JavaSparkContext(conf);
// 读取文本文件
JavaRDD<String> textFile = sc.textFile("test.txt");
// 找出包含apple的行
JavaRDD<String> appleLines = textFile.filter(line -> line.contains("apple"));
// 将包含apple的行按照“,”进行分割,得到一个列表集合
JavaRDD<String[]> lists = appleLines.map(line -> line.split(","));
// 将集合中重复的单词去掉
JavaRDD<List<String>> words = lists.map(Arrays::asList)
.distinct();
// 对单词进行计数
JavaRDD<String> wordCounts = words.mapToPair(word -> new Tuple2<>(word, 1))
.reduceByKey((a, b) -> a + b)
.map(pair -> pair._1() + " " + pair._2());
// 输出结果到本地主目录的output目录下
wordCounts.saveAsTextFile("output");
// 停止JavaSparkContext
sc.stop();
}