zoukankan      html  css  js  c++  java
  • spark学习(2)---RDD

    一、打印RDD内容

    https://blog.csdn.net/wengyupeng/article/details/52808503

    1、方法

    2种方式:

    1              rdd.collect().foreach {println}
    2              rdd.take(10).foreach { println }  //take(10) 取前10个

    2、例子

         val logData = sparkcontext.textFile(logFile, 2).cache()    
    
         logData.collect().foreach {println}
         logData.take(10).foreach { println } 

    二、Spark RDD Key-Value基本转换和动作运算实例

    https://blog.csdn.net/qq_25948717/article/details/81913523

    创建Key-Value RDD

     kvRDD1 = sc.parallelize([(3,6),(6,9),(3,4),(5,6),(1,2)])

    转换:取key和value

    >>> kvRDD1.collect()
    [(3, 6), (6, 9), (3, 4), (5, 6), (1, 2)]
    >>> kvRDD1.keys().collect()
    [3, 6, 3, 5, 1]
    >>> kvRDD1.values().collect()
    [6, 9, 4, 6, 2]

    filter:

    >>> kvRDD1.filter(lambda keyValue:keyValue[0]<5).collect()
    [(3, 6), (3, 4), (1, 2)]
    >>> kvRDD1.filter(lambda keyValue:keyValue[1]<5).collect()
    [(3, 4), (1, 2)]

    mapValues:针对RDD每一组(Key,Value)进行运算

    >>> kvRDD1.mapValues(lambda x:x**2).collect()
    [(3, 36), (6, 81), (3, 16), (5, 36), (1, 4)]

    sortByKey:默认从小到大按照key排序

    >>> kvRDD1.sortByKey(ascending=True).collect()
    [(1, 2), (3, 6), (3, 4), (5, 6), (6, 9)]

    reduceByKey():按照key值进行reduce运算,将相同的key的value相加

    >>> kvRDD1.reduceByKey(lambda x,y:x+y).collect()
    [(5, 6), (1, 2), (6, 9), (3, 10)]
    多个RDD Key-Value转换运算

    >>> kvRDD2 = sc.parallelize([(3,6),(3,8),(6,12)])
    >>> kvRDD1 = sc.parallelize([(3,6),(6,9),(3,4),(5,6),(1,2)])

    jion:将两个RDD按照相同的key值jion起来

    >>> kvRDD1.join(kvRDD2).collect()
    [(3, (6, 6)), (3, (6, 8)), (3, (4, 6)), (3, (4, 8)), (6, (9, 12))]

    leftOuterJoin:如何左边的key值在右边中没有,那么join时value就显示None

    >>> kvRDD1.leftOuterJoin(kvRDD2).collect()
    [(1, (2, None)), (3, (6, 6)), (3, (6, 8)), (3, (4, 6)), (3, (4, 8)), (5, (6, None)), (6, (9, 12))]

    >>> kvRDD1.rightOuterJoin(kvRDD2).collect()
    [(3, (6, 6)), (3, (6, 8)), (3, (4, 6)), (3, (4, 8)), (6, (9, 12))]

    subtractByKey:删除相同key的数据

    >>> kvRDD1.subtractByKey(kvRDD2).collect()
    [(1, 2), (5, 6)]
    Key-Value动作运算

    >>> kvRDD1.first()
    (3, 6)
    >>> kvRDD1.take(3)
    [(3, 6), (6, 9), (3, 4)]
    >>> kvRDD1.first()[0]
    3
    >>> kvRDD1.first()[1]
    6
    >>> kvRDD1.countByKey()
    defaultdict(<class 'int'>, {3: 2, 6: 1, 5: 1, 1: 1})

    查看key值得value有那些?

    >>> kvRDD1.lookup(3)
    [6, 4]

     三、RDD与dataframe的转换

    https://blog.csdn.net/lxhandlbb/article/details/52367605

    DataFrame是一个带有列名的分布式数据集合。等同于一张关系型数据库中的表或者R/Python中的data frame,不过在底层做了很多优化;我们可以使用结构化数据文件、Hive tables,外部数据库或者RDDS来构造DataFrames。
    一、利用反射推断Schema

    Spark SQL能够将含Row对象的RDD转换成DataFrame,并推断数据类型。通过将一个键值对(key/value)列表作为kwargs传给Row类来构造Rows。key定义了表的列名,类型通过看第一列数据来推断。(所以这里RDD的第一列数据不能有缺失)未来版本中将会通过看更多数据来推断数据类型,像现在对JSON文件的处理一样。
    二、编程指定Schema

    通过编程指定Schema需要3步:

    1.从原来的RDD创建一个元祖或列表的RDD。
    2.用StructType 创建一个和步骤一中创建的RDD中元祖或列表的结构相匹配的Schema。
    3.通过SQLContext提供的createDataFrame方法将schema 应用到RDD上。

  • 相关阅读:
    UOJ.26.[IOI2014]Game(交互 思路)
    Good Bye 2016 F.New Year and Finding Roots(交互)
    Codeforces.835E.The penguin's game(交互 按位统计 二分)
    Codeforces.744B.Hongcow's Game(交互 按位统计)
    Codeforces.862D.Mahmoud and Ehab and the binary string(交互 二分)
    正睿OI 提高 Day1T3 ZYB玩字符串(DP)
    划分vlan
    2三层交换机实现vlan间的路由
    交换机基础-交换机远程telnet
    自动化运维环境的搭建问题处理
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/11082591.html
Copyright © 2011-2022 走看看