• PySpark API使用


    rdd Transformation操作:用于创建新的RDD(返回类型RDD),eg:map、mapPartitions、Filter、groupBy等.
    # 只是定义操作,获取最终的结果需要调rdd.collect()、rdd.count()等获取rdd信息的函数,才会真正执行定义的函数.有点类似于tensorflow中定义的计算图. 要求func有返回值,否则需要像foreachPartition底层那样包装下才能执行count()等.
    rdd = rdd.mapPartitions(func)
    rdd Action操作:用于RDD的操作(返回类型为None),它指示Spark执行计算并将结果发送回驱动程序. eg:foreach、foreachPartition、count等. 底层均调的mapPartitions
    # 直接执行自定义函数
    rdd.foreachPartition(func)
    pyspark中字典操作:
    # rdd不支持操作字典,并且sc.parallelize函数的参数c一般均传的list
    若想最终map操作后得到一个字典有以下两种方法:
    方法1:func返回[(key1,val1),(key2,val2),...],即类似namedtuple(推荐)
        def func(arr):
            res = []
            for val in arr:
                res.append((str(val), val))
            return res
        values = list(range(20))
        rdd = sc.parallelize(values, numSlices=4)
        rdd = rdd.mapPartitions(func)
        res = rdd.collectAsMap() # rdd.collect()返回的是list,若rdd为字典则会返回list(keys)
    方法2:func返回[dict]
        def func(arr):
            res = {}
            for val in arr:
                res[str(val)] = val
            return [res]
        values = list(range(20))
        rdd = sc.parallelize(values, numSlices=4)
        rdd = rdd.mapPartitions(func)
        res = rdd.collect()
        result = {}
        for val in res:
            result.update(val)
    获取spark-submit命令传入的spark配置参数:
    spark-submit --name myApp2 --master local --deploy-mode client --driver-cores 1 --driver-memory 4G --num-executors 2 --executor-memory 2G --executor-cores 2 spark_main.py
    # driver与executor相关参数只在yarn模式下才有值
    def printConf(conf: SparkConf):
        print('All: ', conf.getAll())
        print('spark.driver.cores: ', conf.get('spark.driver.cores'))
        print('spark.driver.memory: ', conf.get('spark.driver.memory'))
        print('spark.executor.memory: ', conf.get('spark.executor.memory'))
        print('spark.executor.num: ', conf.get('spark.executor.num'))
        print('spark.executor.cores: ', conf.get('spark.executor.cores'))
        print('spark.app.name: ', conf.get('spark.app.name'))
        print('spark.master: ', conf.get('spark.master'))

    sc.parallelize:划分

    总数量为n,partition数量为m(n>m),a=n//m,b=n%m:
    若b > a:则余数会按a为单位划分成多份,分别叠加到b//a个partition上,b%a给到另一个partition上; (而不是以1为单位)
    若b <=a:则直接随机迭加到某个partition上.

    广播变量的使用:对于比较占内存且一般为只读的在多个任务中用到的变量,推荐定义成广播变量(一般是全局变量)。

    详见:https://www.jianshu.com/p/3bd18acd2f7f

    https://zhuanlan.zhihu.com/p/61589956

    https://www.cnblogs.com/jiangzhengjun/p/7262544.html

    https://www.cnblogs.com/xlturing/p/6652945.html#



  • 相关阅读:
    Error: Can't find Python executable "G:Python27"
    Error: Can't find Python executable "G:Python27"
    翻译
    Docker容器利用weave实现跨主机互联
    Docker容器利用weave实现跨主机互联
    Docker容器利用weave实现跨主机互联
    Docker容器利用weave实现跨主机互联
    python基础-异常(exception)处理
    python基础-异常(exception)处理
    python基础-异常(exception)处理
  • 原文地址:https://www.cnblogs.com/luckyboylch/p/12553506.html
Copyright © 2020-2023  润新知