从本地文件系统读取/home/hadoop/wordData目录下的文件,在spark-shell中编程统计所有文件中各单词出现的次数,并把统计结果保存到/home/hadoop/output2中,要求所有的结果写入一个文件。
时间: 2023-12-25 13:06:59 浏览: 155
可以使用以下代码实现:
```scala
// 创建 SparkSession
val spark = SparkSession.builder().appName("WordCount").getOrCreate()
// 读取文件夹中的文件
val input = spark.sparkContext.textFile("/home/hadoop/wordData/*")
// 将每行数据按照空格分割成单词,并计数为 1
val counts = input.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey(_ + _)
// 将结果保存到文件中
counts.coalesce(1).saveAsTextFile("/home/hadoop/output2")
```
其中,`textFile` 方法用于读取指定路径下的所有文件,`flatMap` 方法将每行数据按照空格分割成单词并展开成一个个新的 RDD,`map` 方法将每个单词计数为 1,`reduceByKey` 方法将相同单词的计数相加。最后,使用 `coalesce` 方法将所有结果合并到一个分区中,并使用 `saveAsTextFile` 方法将结果保存到指定路径。
相关问题
从本地文件系统读取/home/hadoop/wordData目录下的文件,在spark-shell中编程查找所有文件包含“Hadoop”的行,并把结果输出到界面
你可以按照以下步骤在spark-shell中进行编程:
1. 启动spark-shell:
```
$ spark-shell
```
2. 创建一个RDD,读取文件目录下所有文件:
```
val filesRDD = sc.wholeTextFiles("/home/hadoop/wordData")
```
3. 创建一个函数,用于查找包含“Hadoop”的行:
```
def findHadoopLines(text: String): Boolean = {
text.contains("Hadoop")
}
```
4. 对RDD应用map函数,查找每个文件包含“Hadoop”的行:
```
val hadoopLinesRDD = filesRDD.flatMap { case (filename, content) =>
content.split("\n").filter(findHadoopLines).map(line => (filename, line))
}
```
5. 输出结果:
```
hadoopLinesRDD.collect().foreach(println)
```
以上代码会将包含“Hadoop”的行打印到界面上。
阅读全文