Spark编程经典综合案例

1. 求TOP值

两个文件包含4个字段orderid、userid、payment、productid,求TopN个payment值。

file1.txt

1,1768,50,155
2,1218,600,211
3,2239,788,242
4,3101,28,599
5,4899,290,129
6,3110,54,1201
7,4436,259,877
8,2369,7890,27

file2.txt

100,4287,226,233
101,6562,489,124
102,1124,33,17
103,3267,159,179
104,4569,57,125
105,1438,37,116

import org.apache.spark.sql.SparkSession

object Test {
    def main(args: Array[String]): Unit = {
        val spark = SparkSession
          .builder()
          .appName("wc")
          .master("local")
          .getOrCreate()
        spark.sparkContext.setLogLevel("ERROR")
        val input_path = "/Users/zz/Desktop/input/"
        // 分区数目为2,2个文件
        val lines = spark.sparkContext.textFile(input_path, 2)
        var num = 0
        val result = lines.filter(line => (line.trim().length > 0)
          && (line.split(",").length == 4))
          .map(_.split(",")(2))      // 取第三列
          .map(x => (x.toInt, ""))  // 转换为kv
          .sortByKey(false)
          .map(x => x._1).take(5)
          .foreach(x => {
              num = num + 1
              println(num + "\t" + x)
          })
        spark.stop()
    }
}

输出

1    7890
2    788

### Spark算子在Java中的综合案例教程 Spark 是一个分布式计算框架,支持多种编程语言,包括 Java。以下是一个关于 Spark 算子的 Java 综合案例教程,涵盖了常见的 RDD 操作和数据处理流程。 #### 1. 初始化 Spark 环境 在使用 Spark 算子之前,需要初始化 Spark 环境。以下是创建 SparkConf 和 JavaSparkContext 的代码示例[^2]: ```java import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaSparkContext; public class SparkInitializer { public static JavaSparkContext initialize() { SparkConf conf = new SparkConf().setAppName("JavaSparkExample").setMaster("local[*]"); return new JavaSparkContext(conf); } } ``` #### 2. 数据加载与转换 假设有一个文本文件 `data.txt`,包含多行字符串数据。可以使用 `textFile` 方法加载数据,并通过算子进行转换[^3]: ```java import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; public class DataLoadingAndTransformation { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 使用 map 算子对每行数据进行处理 JavaRDD<Integer> wordLengths = lines.map(line -> line.split(" ").length); // 使用 filter 算子过滤出长度大于 5 的行 JavaRDD<String> longLines = lines.filter(line -> line.length() > 5); System.out.println("Word lengths: " + wordLengths.collect()); System.out.println("Long lines: " + longLines.collect()); sc.close(); } } ``` #### 3. 聚合操作 Spark 提供了丰富的聚合操作,例如 `reduce` 和 `fold`。以下是一个统计总单词数的示例[^4]: ```java import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.Function2; public class AggregationExample { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 将每行分割为单词,并展平为单个 RDD JavaRDD<String> words = lines.flatMap(line -> java.util.Arrays.asList(line.split(" ")).iterator()); // 使用 reduce 算子统计总单词数 long totalWords = words.count(); System.out.println("Total words: " + totalWords); sc.close(); } } ``` #### 4. 键值对操作 对于键值对数据,可以使用 `JavaPairRDD` 进行操作。以下是一个按单词计数的示例[^5]: ```java import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class KeyValueOperations { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); JavaRDD<String> lines = sc.textFile("data.txt"); // 将每行分割为单词,并映射为键值对 (word, 1) JavaPairRDD<String, Integer> wordPairs = lines.flatMap(line -> java.util.Arrays.asList(line.split(" ")).iterator()) .mapToPair(word -> new Tuple2<>(word, 1)); // 使用 reduceByKey 算子统计每个单词的出现次数 JavaPairRDD<String, Integer> wordCounts = wordPairs.reduceByKey((a, b) -> a + b); System.out.println("Word counts: " + wordCounts.collect()); sc.close(); } } ``` #### 5. 高级算子 除了基本的算子外,Spark 还提供了许多高级算子,如 `join`、`groupByKey` 和 `cogroup`。以下是一个简单的 `join` 示例[^6]: ```java import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaSparkContext; import scala.Tuple2; public class AdvancedOperators { public static void main(String[] args) { JavaSparkContext sc = SparkInitializer.initialize(); // 创建两个键值对 RDD JavaPairRDD<String, Integer> rdd1 = sc.parallelizePairs(java.util.Arrays.asList( new Tuple2<>("a", 1), new Tuple2<>("b", 2), new Tuple2<>("c", 3))); JavaPairRDD<String, String> rdd2 = sc.parallelizePairs(java.util.Arrays.asList( new Tuple2<>("a", "x"), new Tuple2<>("b", "y"), new Tuple2<>("d", "z"))); // 使用 join 算子合并两个 RDD JavaPairRDD<String, Tuple2<Integer, String>> joined = rdd1.join(rdd2); System.out.println("Joined RDD: " + joined.collect()); sc.close(); } } ``` ### 总结 上述案例展示了如何在 Java 中使用 Spark 算子进行数据加载、转换、聚合以及键值对操作。这些算子是 Spark 的核心功能,适用于各种复杂的数据处理任务。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值