zoukankan      html  css  js  c++  java
  • Spark 编程模型(下)

    创建Pair RDD

    什么是Pair RDD

    ● 包含键值对类型的RDD被称作Pair RDD

    ● Pair RDD通常用来进行聚合计算

    ● Pair RDD通常由普通RDD做ETL转换而来

    创建Pair RDD

    ● Python:pairs = lines.map(lambda x: (x.split(" ")[0], x))
    ● Scala:val pairs = lines.map(x => (x.split(" ")(0), x))
    ● Java:
    PairFunction<string, string,="" string=""> keyData =
    	new PairFunction<string, string,="" string="">() {
    	public Tuple2<string, string=""> call(String x) {
    		return new Tuple2(x.split(" ")[0], x);
    	}
    };
    JavaPairRDD<string, string=""> pairs = lines.mapToPair(keyData);
    

    Pair RDD的transformation操作

    Pair RDD转换操作1

    ● Pair RDD 可以使用所有标准RDD 上转化操作,还提供了特有的转换操作。

    Pair RDD转换操作2

    Pair RDD的action操作

    Pair RDD转换操作1

    ● 所有基础RDD 支持的行动操作也都在pair RDD 上可用

     

    Pair RDD的分区控制

    Pair RDD的分区控制

    ● Spark 中所有的键值对RDD 都可以进行分区控制---自定义分区

    ● 自定义分区的好处:

    1)避免数据倾斜

    2)控制task并行度

    自定义分区方式

    class DomainNamePartitioner(numParts: Int) extends Partitioner {
    	override def numPartitions: Int = numParts
    	override def getPartition(key: Any): Int = {
    		val domain = new Java.net.URL(key.toString).getHost()
    		val code = (domain.hashCode % numPartitions)
    		if(code < 0) {
    			code + numPartitions // 使其非负
    		}else{
    			code
    		}
    	}
    	// 用来让Spark区分分区函数对象的Java equals方法
    	override def equals(other: Any): Boolean = other match {
    		case dnp: DomainNamePartitioner =>
    			dnp.numPartitions == numPartitions
    		case _ =>
    			false
    	}
    }
       
    	
  • 相关阅读:
    linux下netstat命令详解
    linux下strace命令详解
    /proc/uptime
    趣味理解网关、路由等概念
    OPENCV运行的问题,自带的程序可以运行,但是自己制作的QT报错
    第九章 MIZ702 ZYNQ片上ADC的使用
    第四章 MIZ701 ZYNQ制作UBOOT固化程序
    第三章 VIVADO 自定义IP 流水灯实验
    第一章 MIZ701 VIVADO 搭建SOC最小系统HelloWorld
    Zynq-7000 MiZ701 SOC硬件使用手册
  • 原文地址:https://www.cnblogs.com/fengyouheng/p/10298247.html
Copyright © 2011-2022 走看看