• 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上。

  • 相关阅读:
    解决:ElasticSearch ClusterBlockException[blocked by: [FORBIDDEN/12/index readonly / allow delete (api)];
    Centos 常用命令
    Nodejs的path模块
    webpack externals
    F#反射获取名称的三种方法
    JDK源码阅读之:JDK8的 CHM 为何放弃分段锁
    Mysql基础之:MySQL各种类型索引的及其优缺点介绍
    Java高并发之:从浅入深掌握并发执行框架Executor
    如何读懂火焰图?+ 实例讲解程序性能优化
    Java高并发之:深入浅出线程池+高级选项的使用
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/11082591.html
Copyright © 2020-2023  润新知