spark算子:combineByKey

假设我们有一组个人信息,我们针对人的性别进行分组统计,并进行统计每个分组中的记录数。

scala> val people = List(("male", "Mobin"), ("male", "Kpop"), ("female", "Lucy"), ("male", "Lufei"), ("female", "Amy"))
      people: List[(String, String)] = List((male,Mobin), (male,Kpop), (female,Lucy), (male,Lufei), (female,Amy))

scala> val rdd = sc.parallelize(people)
      rdd: org.apache.spark.rdd.RDD[(String, String)] = ParallelCollectionRDD[0] at parallelize at <console>:23

scala> val combinByKeyRDD = rdd.combineByKey(
           |   (x: String) => (List(x), 1),
           |   (peo: (List[String], Int), x : String) => (x :: peo._1, peo._2 + 1),
           |   (sex1: (List[String], Int), sex2: (List[String], Int)) => (sex1._1 ::: sex2._1, sex1._2 + sex2._2))
combinByKeyRDD: org.apache.spark.rdd.RDD[(String, (List[String], Int))] = ShuffledRDD[1] at combineByKey at <console>:25

scala> combinByKeyRDD.foreach(println)
      (female,(List(Lucy, Amy),2))
      (male,(List(Mobin, Kpop, Lufei),3))
scala>

输出步骤:

Partition1:
K="male"  -->  ("male","Mobin")  --> createCombiner("Mobin") =>  peo1 = (  List("Mobin") , 1 )
K="male"  -->  ("male","Kpop")  --> mergeValue(peo1,"Kpop") =>  peo2 = (  "Kpop"  ::  peo1_1 , 1 + 1 )    //Key相同调用mergeValue函数对值进行合并
K="female"  -->  ("female","Lucy")  --> createCombiner("Lucy") =>  peo3 = (  List("Lucy") , 1 )

Partition2:
K="male"  -->  ("male","Lufei")  --> createCombiner("Lufei") =>  peo4 = (  List("Lufei") , 1 )
K="female"  -->  ("female","Amy")  --> createCombiner("Amy") =>  peo5 = (  List("Amy") , 1 )

Merger Partition:
K="male" --> mergeCombiners(peo2,peo4) => (List(Lufei,Kpop,Mobin))
K="female" --> mergeCombiners(peo3,peo5) => (List(Amy,Lucy))

上边的信息中,个人信息中只有一个值,如果value是元组的话,需要定义出一个type:

scala>       val people = List(("male", ("Mobin",89)),("male", ("Kpop",98)),("female", ("Lucy",99)),("male", ("Lufei",77)),("female", ("Amy",97)))
scala>       val rdd = sc.parallelize(people)
rdd: org.apache.spark.rdd.RDD[(String, (String, Int))] = ParallelCollectionRDD[2] at parallelize at <console>:23

scala>   type MVType = (String, Int)
defined type alias MVType

scala>       val combinByKeyRDD = rdd.combineByKey(
     |         (x: MVType) => (List(x), 1),
     |         (peo: (List[MVType], Int), x:MVType) => (x :: peo._1, peo._2 + 1),
     |         (sex1: (List[MVType], Int), sex2: (List[MVType], Int)) => (sex1._1 ::: sex2._1, sex1._2 + sex2._2))
combinByKeyRDD: org.apache.spark.rdd.RDD[(String, (List[(String, Int)], Int))] = ShuffledRDD[3] at combineByKey at <console>:27

scala>    combinByKeyRDD.foreach(println)
(male,(List((Mobin,89), (Kpop,98), (Lufei,77)),3))
(female,(List((Lucy,99), (Amy,97)),2))

 

<think>我们正在讨论的是.cproject文件。根据之前的引用[2],它提到eclipse的项目和配置文件包括.project、.cproject、.classpath、.metadata。因此,.cproject文件是Eclipse集成开发环境(IDE)中用于C/C++开发的项目配置文件。 具体来说: - Eclipse是一个开源的集成开发环境,广泛用于Java开发,但通过插件也支持其他语言,如C/C++(CDT插件)。 - 当在Eclipse中创建一个C或C++项目时,它会生成.project和.cproject文件。 - .project文件包含项目的基本信息,如项目名称和构建器配置,这是任何Eclipse项目都有的。 - .cproject文件则是专门为C/C++项目生成的,它包含了C/C++项目的特定配置,如编译器设置、构建器设置、路径设置(包含路径、库路径)等。 因此,.cproject文件是Eclipse CDT(C/C++ Development Tooling)工程的核心配置文件。 注意:引用[2]中提到了在Eclipse的Java Build Path中配置源文件夹,但同样,对于C/C++项目,配置信息则存储在.cproject文件中。 总结:.cproject文件是Eclipse IDE中用于C/C++项目的配置文件,它存储了项目的编译、链接、路径等设置。 相关问题: 1. .cproject文件通常包含哪些类型的配置信息? 2. 如何手动修改.cproject文件? 3. Eclipse CDT项目中的.cproject文件与.project文件有何区别? 4. 如果.cproject文件损坏,如何恢复Eclipse C/C++项目的配置?</think>### .cproject 文件解析 **.cproject** 文件是 **Eclipse IDE(集成开发环境)** 中专门用于 **C/C++ 项目** 的核心工程配置文件。它属于 Eclipse CDT(C/C++ Development Tooling)插件生成的项目元数据文件,存储项目的编译、链接、路径等关键构建信息。 #### 主要特征: 1. **文件类型** XML 格式的配置文件,可通过文本编辑器查看,但通常由 Eclipse 自动管理。 2. **核心作用** - 存储编译器/链接器设置(如 GCC、Clang 的编译选项) - 定义头文件搜索路径(`-I` 参数) - 配置库依赖关系(`-L` 和 `-l` 参数) - 管理构建目标(Debug/Release 配置) - 集成调试器设置(如 GDB 配置)[^1] 3. **关联文件** 通常与以下文件共存于项目根目录: - `.project`:通用 Eclipse 项目描述文件 - `.settings/`:目录存储工作区级配置 - `.cproject` 需配合 CDT 插件使用(非纯 Java 项目)[^2] #### 典型场景示例: ```xml <!-- .cproject 片段:配置 GCC 编译器 --> <storageModule moduleId="cdtBuildSystem"> <cconfiguration id="cdt.managedbuild.config.gnu.exe.release"> <toolChain id="cdt.managedbuild.toolchain.gnu.exe.release"> <targetPlatform arch="x86_64"/> <tool name="gcc" options="-O2 -Wall"/> <includePath path="/usr/local/include"/> </toolChain> </cconfiguration> </storageModule> ``` #### 注意事项: - **勿手动编辑**:直接修改易导致项目损坏,建议通过 Eclipse 的 **"Project > Properties > C/C++ Build"** 界面调整设置。 - **版本控制**:需纳入 Git/SVN 管理以确保团队构建环境一致。 - **跨平台限制**:路径配置可能含系统绝对路径,跨平台时需注意[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值