pyspark-Spark编程指南

参考:

1、http://spark.apache.org/docs/latest/rdd-programming-guide.html

2、https://github.com/apache/spark/tree/v2.2.0


Spark编程指南


连接Spark

from pyspark import SparkContext, SparkConf

初始化Spark

from pyspark import SparkContext, SparkConf

conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)


使用Shell

spark-submit 参考: spark-submit script.

$ ./bin/pyspark --master local[4]

$ ./bin/pyspark --master local[4] --py-files code.py

弹性分布式数据集 (RDDs)

并行集合

data = [1, 2, 3, 4, 5]
distData = sc.parallelize(data)

外部数据集

# Text file RDDs can be created using SparkContext’s textFile method.
# This method takes an URI for the file (either a local path on the machine,
# or a hdfs://, s3n://, etc URI) and reads it as a collection of lines.
>>> distFile = sc.textFile("data.txt")

textFile("/my/directory"), textFile("/my/directory/*.txt"), and textFile("/my/directory/*.gz").

# lets you read a directory containing multiple small text files
SparkContext.wholeTextFiles

RDD.saveAsPickleFile and SparkContext.pickleFile 
# support saving an RDD in a simple format consisting of pickled Python objects.

保存和加载SequenceFiles

>>> rdd = sc.parallelize(range(1, 4)).map(lambda x: (x, "a" * x))
>>> rdd.saveAsSequenceFile("path/to/file")
>>> sorted(sc.sequenceFile("path/to/file").collect())
[(1, u'a'), (2, u'aa'), (3, u'aaa')]

保存和加载其他Hadoop输入/输出格式

$ ./bin/pyspark --jars /path/to/elasticsearch-hadoop.jar
>>> conf = {"es.resource" : "index/type"}  # assume Elasticsearch is running on localhost defaults
>>> rdd = sc.newAPIHadoopRDD("org.elasticsearch.hadoop.mr.EsInputFormat",
                             "org.apache.hadoop.io.NullWritable",
                             "org.elasticsearch.hadoop.mr.LinkedMapWritable",
                             conf=conf)
>>> rdd.first()  # the result is a MapWritable that is converted to a Python dict
(u'Elasticsearch ID',
 {u'field1': True,
  u'field2': u'Some Text',
  u'field3': 12345})


RDD 操作

lines = sc.textFile("data.txt")
lineLengths = lines.map(lambda s: len(s))
totalLength = lineLengths.reduce(lambda a, b: a + b)

lineLengths.persist()

传递函数到Spark

"""MyScript.py"""
if __name__ == "__main__":
    def myFunc(s):
        words = s.split(" ")
        return len(words)

    sc = SparkContext(...)
    sc.textFile("file.txt").map(myFunc)


class MyClass(object):
    def func(self, s):
        return s
    def doStuff(self, rdd):
        return rdd.map(self.func)


class MyClass(object):
    def __init__(self):
        self.field = "Hello"
    def doStuff(self, rdd):
        return rdd.map(lambda s: self.field + s)

def doStuff(self, rdd):
    field = self.field
    return rdd.map(lambda s: field + s)

了解关闭

例子
counter = 0
rdd = sc.parallelize(data)

# Wrong: Don't do this!!
def increment_counter(x):
    global counter
    counter += x
rdd.foreach(increment_counter)

print("Counter value: ", counter)


使用键值对

lines = sc.textFile("data.txt")
pairs = lines.map(lambda s: (s, 1))
counts = pairs.reduceByKey(lambda a, b: a + b)

变量共享

广播变量

>>> broadcastVar = sc.broadcast([1, 2, 3])
<pyspark.broadcast.Broadcast object at 0x102789f10>

>>> broadcastVar.value  # list
[1, 2, 3]
da=sc.parallelize(broadcastVar.value) # -->RDD

 
 
累加器

>>> accum = sc.accumulator(0)
>>> accum
Accumulator<id=0, value=0>

>>> sc.parallelize([1, 2, 3, 4]).foreach(lambda x: accum.add(x))
...
10/09/29 18:41:08 INFO SparkContext: Tasks finished in 0.317106 s
>>> accum.value # <type 'int'>
10
class VectorAccumulatorParam(AccumulatorParam):
    def zero(self, initialValue):
        return Vector.zeros(initialValue.size)

    def addInPlace(self, v1, v2):
        v1 += v2
        return v1

# Then, create an Accumulator of this type:
vecAccum = sc.accumulator(Vector(...), VectorAccumulatorParam())

accum = sc.accumulator(0)
def g(x):
    accum.add(x)
    return f(x)
data.map(g)
# Here, accum is still 0 because no actions have caused the `map` to be computed.

### 回答1: 大数据手册(Spark)是一本关于Apache Spark指南,其中包括了Spark的基础知识、应用场景、实践案例等内容。其中,Spark流数据处理(pyspark版)是指使用Python编程语言进行Spark流数据处理的相关内容。在这个章节中,读者将学习如何使用pyspark进行流数据处理,包括数据流的读取、转换、过滤、聚合等操作,以及如何将处理结果输出到外部系统中。通过学习这一章节,读者将掌握使用pyspark进行流数据处理的基本技能,为实际应用场景提供支持。 ### 回答2: 大数据手册是一本面向数据领域从业者的参考书,其中涵盖了各种大数据处理技术和工具,包括Spark流数据处理。Spark是Apache的一个计算框架,它有着广泛的应用场景,从离线批处理到流数据处理,都能提供高效的计算能力。而pyspark,则是Spark提供的Python API,让Python从业者可以方便地使用Spark进行数据处理。 在Spark流数据处理方面,Spark提供了两种实现方式:基于RDD的流处理和基于Structured Streaming的流处理。其中,基于RDD的流处理在Spark 2.0 之前是唯一的流处理方式,但受到了一些限制,例如不能实现精确一次处理等。而在Spark 2.0 引入的Structured Streaming则是一种基于连续处理模型的处理方式,可以实现精确一次处理,并具有更高的性能和更简单的编程模型。因此,我们重点介绍基于Structured Streaming的流数据处理。 基于Structured Streaming的流数据处理,其核心概念是流数据的抽象,即流数据是一连串连续的数据,它可以看作是一个不断更新的表格数据。Spark提供了DataFrame API 来处理这种数据类型,可以方便地与传统的批处理DataFrame API进行交互。在Structured Streaming中,用户只需要指定输入数据源、数据处理逻辑和输出数据源,Spark将自动将其转换为一个流数据处理作业。 在进行流数据处理时,常用的操作有过滤、聚合、窗口等操作。Spark提供了丰富的DataFrame API和函数来实现这些操作,例如filter、groupBy、window等函数。在实际应用中,我们还需要考虑窗口长度、滑动间隔等参数来优化处理效率。 另外,对于一些特殊场景,例如数据乱序、数据延迟等问题,也需要进行相应的处理。Spark提供了一些可靠性处理机制,例如水印(Watermark)、状态管理和容错机制等,来应对这些问题。 总体来说,Spark流数据处理提供了一种高效、可靠的流数据处理方案,可以满足对实时数据处理的需求。而基于Structured Streaming的流处理还具有更高的性能和更简单的编程模型,可以方便地与传统的批处理进行交互。因此,对于需要进行实时数据处理的应用场景,Spark流数据处理是一种值得考虑的选择。 ### 回答3: Spark是一个为大规模数据处理而设计的开源计算框架,是目前业界最流行的分布式计算框架之一。Spark通过使用内存计算技术来提高处理速度。Spark还具有良好的编程接口和易用性,可以通过Python(pyspark)、Java、Scala等语言进行编程Spark流数据处理(pyspark版)是用pyspark编写的一本大数据手册,用于讲解Spark流数据处理的相关知识和实践方法。该手册从流数据处理的基本概念开始讲解,包括流数据的定义、特点和处理流程,还介绍了pyspark中常用的流数据处理API。 该手册主要有以下内容: 1. Spark流数据处理的基础知识。包括流数据的定义、特点、应用场景和处理流程等。 2. Spark流数据处理API的介绍。讲解pyspark中常用的流数据处理API,如Socket Stream、File Stream、Kafka Stream等。 3. Spark流数据处理的实践应用。介绍流数据处理在实际应用中的典型案例,如实时数据分析、实时数据可视化和实时数据挖掘等。 4. Spark流数据处理的优化技巧。讲解如何通过优化代码、调整配置参数等方法来提高流数据处理的性能和效率。 总之,Spark流数据处理(pyspark版)侧重于讲解Spark在流数据处理方面的应用,针对不同的应用场景和需求提供了不同的解决方案和技巧,对于从事大数据处理的开发者和数据分析师来说,是一份非常有价值的学习资料。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值