pyspark 对RDD的相关api

1、aggregate,可以用来求平均值

pyspark 对RDD的相关api_第1张图片

如下示例

rdd2 = spark.sparkContext.parallelize([1,2,3,4,5,6,7,8,9,10])

seqop = (lambda x,y: (x[0]+ y, x[1]+ 1))        #0+1 0+1 1+2 1+1 3+3 2+1
cpmop= (lambda  x,y: (x[0]+ y[0], x[1]+ y[1]))   #用于分布式计算时的聚合

res = rdd2.aggregate((0,0), seqop, cpmop)       #这样可以求平均数
return float(res[0]) / res[1]

2、coalesce   聚合分区,glom视为可以方便看出有几个分区

pyspark 对RDD的相关api_第2张图片

3、cogroup   取出一个key在自身存在,在另外一个也存在,则返回同一个key对应的所有的values,以touple的形式返回

pyspark 对RDD的相关api_第3张图片

4、collectAsMap    将元组形式的rdd返回为一个  字典形式,如果参数不是2个,这个方法则不适用,会报错

pyspark 对RDD的相关api_第4张图片

报错如下,需要长度为2的参数

pyspark 对RDD的相关api_第5张图片

5、combineByKey     对同一个rdd相同的key的value进行合并为一个list,并返回为一个新的RDD

理解:append针对key  因为append加入的是一个obj  相同的key只会存在一个

          extend针对value  因为相同的key的value会进行重复添加,到我们的列表里,不会因为存在而不追加

pyspark 对RDD的相关api_第6张图片

6、countByKey     和reduceByKey的用法一样,但是countbykey是action算子,reducebykey是tranformation,不会立即执行,通常用reducebykey这个操作,  等价于  data.reduceByKey(_+_).collectAsMap()

pyspark 对RDD的相关api_第7张图片

7、countbyvalue       如下返回每个value在  序列中出现的次数

pyspark 对RDD的相关api_第8张图片

8、distinct    去重,这个用过sql应该就知道的

pyspark 对RDD的相关api_第9张图片

9、filter     过滤,返回表达式为true的值

pyspark 对RDD的相关api_第10张图片

10、flatMap   这个记住,这是一个1对多的算子,rdd的一个参数进来,根据表达式,会有多个返回值,相当于展开,如下

每个参数都会有不同的返回值,可以看最后一个flatmap的形式 等价于map(lambda x: (x, x)).collect()

pyspark 对RDD的相关api_第11张图片

11、fold    如下    rdd为[1,2,3,4,5]   给定一个初始值,按照cmp方式,对元素进行折叠,这里为add

pyspark 对RDD的相关api_第12张图片

12、foldbykey     对相同的key的values进行相应的fold计算,   如下操作

pyspark 对RDD的相关api_第13张图片

13、foreach(f)     对rdd每个元素进行相应的函数操作

14、foreachpartition    对rdd每个分区的每个元素进行操作

pyspark 对RDD的相关api_第14张图片

15、fullOuterJoin        返回两个RDD 相同的key,和对应的value组成的touple(key,(value1,value2)),没有则返回None

pyspark 对RDD的相关api_第15张图片

16、getCheckpointFile(filepath)        得到checkpoint下来的数据,并返回rdd

17、getNumPartitions()     getStorageLevel()     得到一个rdd的分区,和缓存的级别

18、groupby     对一个RDD的每一个value,做一个函数操作,根据对应的返回值,对其进行分组,并返回新的RDD

pyspark 对RDD的相关api_第16张图片

19、groupByKey      对touple形式的rdd按key值进行聚合  返回为(key,[value1,value2]),然后对value的list求长度,就可以做到和wordcount一样的效果、但是如果是做聚合操作尽量用reducebykey和aggregatebykey

mapvalues(f)      对每个touple形式的元素的value进行f(value) => (key,f(value))

pyspark 对RDD的相关api_第17张图片

20、intersection(other)       两个rdd取交集,同样适用于dataframe,取表中完全相同的行

pyspark 对RDD的相关api_第18张图片

21、isEmpty()    判断RDD是否为空,常用于  第一次unionall的时候对dataframe进行判断,选择相应的操作

22、leftOuterJoin(other),rightOuterJoin(other),   跟fullOuterJoin一样,这里left以左表为驱动表没有join上则换回none,right一样

23、lookup(key)        根据对应的key 返回对应的value,   如下所示,如果是有序的key,找起来会更快

pyspark 对RDD的相关api_第19张图片

24、map(f)       map返回的是一对一的关系,一个元素返回f(x)     常用于转换我们的数据格式

pyspark 对RDD的相关api_第20张图片

25、mapPartitions(f)      对每个分区的元素惊醒 f(values)操作      yield用法  参考http://python.jobbole.com/87613/

pyspark 对RDD的相关api_第21张图片

26、mapValues(f)      对value进行f(value) =>   (key,f(value))的形式

pyspark 对RDD的相关api_第22张图片

27、reduce(f)   对元素做相应的折叠操作   2 for _ in range(10)   这里就相当于取10次2

pyspark 对RDD的相关api_第23张图片

28、reduceByKey(f)         对同一个key的values   进行f(value)操作    (key,values) => (key,f(value1,value2))  => 下一次迭代

pyspark 对RDD的相关api_第24张图片

29、repartition(num)      对rdd的重新分区,分为num个分区

pyspark 对RDD的相关api_第25张图片

30、repartitionAndSortWithinPartitions(num,function)   对一个RDD进行重分区num 分区内部有排序,分区规则为function的返回结果为分区个数,如果分区个数大于,function的返回结果个数,则会存在空的元素  => []

pyspark 对RDD的相关api_第26张图片

31、sortedBy(index)        对RDD内部进行升序排序 ,按照我们给定的规则

pyspark 对RDD的相关api_第27张图片

32、sortByKey(ascending=TruenumPartitions=Nonekeyfunc=

pyspark 对RDD的相关api_第28张图片

33、subtract(othernumPartitions=None), 按照元素的全部内容进行去重,保留自身存在  other不存在的元素,同样适用于dataframe的相关行的去重

pyspark 对RDD的相关api_第29张图片

34、subtractByKey(othernumPartitions=None),  按照key值取反集

pyspark 对RDD的相关api_第30张图片

35、union(rdd)    只适用于同一种数据格式的rdd,不然后面的rdd转换操作,不好进行,找不到合适的方法,对RDD进行有效的处理

pyspark 对RDD的相关api_第31张图片

36、values    返回touple的values

pyspark 对RDD的相关api_第32张图片

37、zip     拉链操作,  对两个rdd进行压缩,但是元素个数要一致,和list的压缩一致

pyspark 对RDD的相关api_第33张图片

38、zipWithIndex     根据value => (value,index)

pyspark 对RDD的相关api_第34张图片

39、读取json字符串的dataframe

      df = spark.createDataFrame([['{"a":"b"}']],['c'])

     res = spark.read.json(df.rdd.map(lambda row: row.c))            

     res -> schema a:string

 

40,foreachPartition之写入数据库

 

# encoding=utf-8
import sys, os
from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
import time, copy, re, math
from datetime import datetime, timedelta
import json
import logging, pymysql
from collections import OrderedDict
from elasticsearch import Elasticsearch
from elasticsearch.helpers import bulk

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
logger = logging.getLogger(__name__)


warehouse_location = '/user/hive/warehouse/'
conf = SparkConf().set('spark.driver.maxResultSize', '10g')
conf.set('spark.executor.memoryOverhead', '30g')
conf.set('spark.yarn.am.cores', 5)
conf.set('spark.executor.memory', '50g')
conf.set('spark.executor.instances', 80)
conf.set("spark.sql.shuffle.partitions",2000)
conf.set('spark.executor.cores', 8)
conf.set('spark.executor.extraJavaOptions', '-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseG1GC')
conf.set("spark.sql.warehouse.dir", warehouse_location)
conf.set("spark.sql.crossJoin.enabled", "true")
conf.set("spark.security.credentials.renewalRaio", "0.000000000007")

spark = SparkSession \
    .builder \
    .config(conf=conf) \
    .enableHiveSupport() \
    .getOrCreate()
from sparkDemo.common import *
commonUtil = CommonUdf(spark)

def forecah_insert(rows):
    edges = []
    for row in rows:
        edges.append((row.user_id,row.target_num,row.start_time,row.end_time))
        if len(edges) == 10000:
            insert_data(edges)
            edges *= 0
    insert_data(edges)
    
    
def forecah_bulk(rows):
    edges = []
    es = Elasticsearch(['12.68.1.31','12.68.1.32','12.68.1.33'],port=9200)
    for row in rows:
        edges.append((row.user_id,row.target_num,row.start_time,row.end_time))
        if len(edges) == 10000:
            bulk_data('makenodes','search_edge',es,edges)
            edges *= 0
    bulk_data('makenodes','search_edge',es,edges)
        

def insert_data(edges):
    conn = pymysql.connect(host='12.68.2.21', port=3306, user='root', passwd='BBDerscom!@#', db='mysql', charset='utf8')
    cursor = conn.cursor()
    sql = ''' insert into pangu.edge_test (user_id, target_num, start_time, end_time) values (%s, %s, %s, %s) '''
    cursor.executemany(sql,edges)
    conn.commit()
    print('insert success')
    conn.close()
    
    
def bulk_data(index,doc_type,es,edges):
    ACTIONS = []
    for line in edges:
        action = {
            '_index': index,
            '_type': doc_type,
            '_source':{
                'user_id':line[0],
                'target_num':line[1],
                'start_time':line[2],
                'end_time':line[3]
                }
        }
        ACTIONS.append(action)
    success, _ = bulk(es,ACTIONS,index=index,raise_on_error=True)
    logger.info('bulkload success %d data'%success)
    
def do_filter():
    # df = spark.read.orc('/user/bbd/dev/extension_relation/edge_person_search_target').limit(500000)
    df = spark.createDataFrame([(1, 2, 2, 1), (2, 3, 4, 5)], schema=['user_id', 'target_num', 'start_time', 'end_time'])
    #df.foreachPartition(forecah_insert)
    df.foreachPartition(forecah_bulk)


if __name__ == '__main__':
    do_filter()



# spark-submit --py-files /home/bbd/workspace/online/common.py --master yarn \
#     --deploy-mode  cluster \
#     --archives hdfs://hacluster/user/bbd/dev/qindong/extension_relation/mini.zip#mini \
#     --conf "spark.executorEnv.PYSPARK_PYTHON=mini/mini/bin/python" \
#     --conf "spark.executorEnv.PYSPARK_DRIVER=mini/mini/bin/python" \
#     --conf "spark.yarn.appMasterEnv.PYSPARK_PYTHON=mini/mini/bin/python" \
#     --conf "spark.yarn.appMasterEnv.PYSPARK_DRIVER=mini/mini/bin/python" \
#     --name partition_test \
#     --driver-memory 40g \
#     --queue bbd_01 my_partition_test.py
#


 

 

 

 

你可能感兴趣的:(spark,python)