1. 快速开始
本教程提供了使用Spark的快速介绍。我们将首先通过Spark的交互式shell (在Python或Scala环境中) 介绍APl,然后展示如何用Java、Scala和Python编写应用程序。
跟随本指南,首先,从Spark网站下载Spark的打包发行版。由于我们不使用HDFS,您可以下载适用于任何版本Hadoop的软件包。
请注意,在Spark2.0之前,Spark的主要编程接口是弹性分布式数据集 (RDD)(Resilient Distributed Dataset)。在Spark2.0之后,RDD被Dataset所取代,Dataset像RDD一样是强类型的,但在hood(底层)下有更丰富的优化。仍然支持RDD接口,您可以在RDD编程指南中获得更详细的参考。但是,我们强烈建议您切换到使用Dataset,它比RDD有更好的性能。请参阅SOL编程指南以获取有关Dataset的更多信息。
1.1. 使用spark shell进行交互式分析
1.1.1. 基础(basics)
spark的shell提供了一个简单的方式去学习API,同时也是一个强大的交互式数据分析工具。它可以在Scala (运行在JVM上,因此是使用现有Java库的好方法)或Python中使用。通过在Spark目录中运行以下命令来启动它:
./bin/pyspark
或者,如果PySpark已经使用pip安装在你当前的环境中的话,直接用这个命令:
pyspark
Spark的主要抽象是一个名为Dataset的分布式项目集合。数据集可以从Hadoop InputFormat(如HDFS文件)或通过转换其他数据集来创建。由于Python的动态特性,我们不需要在Python中强类型的数据集。因此,Python中的所有数据集都是Dataset[Row],我们称之为DataFrame,与Pandas和R中的数据框架概念保持一致,让我们根据Spark源目录中的README文本创建一个新的DataFrame:
>>> textFile=spark.read.text("README.md")
你可以通过调用某些操作从DataFrame中直接得到值,或者转换DataFrame得到一个新的DataFrame。更多的细节请阅读API文档。
>>> textFile.count() # Number of rows in this DataFrame
126
>>> textFile.first() # First row in this DataFrame
Row(value=u'# Apache Spark')
现在让我们转化这个DataFrame为一个新的DataFrame,我们调用filter去返回一个新的DataFrame,包含文件中行的子集。
>>> linesWithSpark=textFile.filter(textFile.value.contains("Spark"))
我们可以将转换和操作连接在一起:
>>> textFile.filter(textFile.value.contains("Spark")).count() # 有多少行包含有“Spark”?
15
1.1.2. 更多的Dataset操作
Dataset操作和转换可以实现更复杂的计算,假设我们想找到更多单词的行:
>>> from pyspark.sql import functions as sf
>>> textFile.select(sf.size(sf.split(textFile.value,"\s+")).name("numWords")).agg(sf.max(sf.col("numWords"))).collect()
[Row(max(numWords)=15)]
首先将一行映射到一个整数值并将其别名为“numWords”,创建一个新的 DataFrame。在该DataFrame 上调用 agg 来查找最大字数。 select和 agg 的参数都是 Column,我们可以使用df.colName 从 DataFrame 中获取列。我们还可以导入 pyspark.sql.functions,它提供了很多方便的函数来从旧列构建新列.
一种常见的数据流模式是由 Hadoop 推广的MapReduce。 Spark可以轻松实现MapReduce流程:
>>> wordCounts=textFile.select(sf.explode(sf.split(textFile.value,"\s+")).alias("word")).groupBy("word").count()
在这里,我们使用 select 中的爆炸函数(the explode function),将行数据集转换为单词数据集,然后结合 groupBy 和 count来计算文件中每个单词的数量,作为 2 列的DataFrame:“word”和“count”。要在我们的 shell 中收集字数统计,我们可以调用collect:
>>> wordCount.collect()
[Row(word=u'online', count=1), Row(word=u'graphs', count=1), ... ]
1.1.3. 缓存
!!!---------持续更新中-----------!!!