Spark官方文档-SparkCore

快速开始

RDD

1.Spark 的主要抽象是一个分布式弹性数据集(RDD),可以从 Hadoop InputFormats(例如 HDFS 文件)或通过转换其他RDD来创建RDD。

val textFile = spark.read.textFile("README.md")

2.可以通过调用某些操作直接从 RDD中获取值,或者转换RDD以获得新的值

 textFile.count() 
textFile.first() // First item in this Dataset

3.将此数据集转换为新的数据集。我们调用filter返回一个包含文件中RDD子集的新数据集。

val linesWithSpark = textFile.filter(line => line.contains("Spark"))

 

更多关于数据集操作

1.找到单词最多的那一行:

先计算每行单词数;reduce在该数据集上调用以查找最大字数;

textFile.map(line => line.split(" ").size).reduce((a, b) => if (a > b) a else b)
textFile.map(line => line.split(" ").size).reduce((a, b) => Math.max(a, b))

 

 

RDD

初始化 Spark

Spark 程序必须做的第一件事是创建一个SparkContext对象,它告诉 Spark 如何访问集群。要创建一个,SparkContext您首先需要构建一个SparkConf对象,该对象包含有关您的应用程序的信息。每个 JVM 应该只有一个 SparkContext 处于活动状态。stop()在创建新的之前,您必须激活 SparkContext。

val conf = new SparkConf().setAppName(appName).setMaster(master)
new SparkContext(conf)

appName参数是您的应用程序在集群 UI 上显示的名称。 master是一个Spark、Mesos 或 YARN 集群 URL,或者一个特殊的“本地”字符串以在本地模式下运行。 

Using the Shell

$ ./bin/spark-shell --master local[4] --jars code.jar

弹性分布式数据集 (RDD)

Spark 围绕弹性分布式数据集(RDD)的概念展开,RDD 是可以并行操作的元素的容错集合。

有两种方法可以创建 RDD: 在驱动程序中并行化现有集合,或引用外部存储系统中的数据集,例如共享文件系统、HDFS、HBase 或任何提供 Hadoop InputFormat 的数据源。

并行集合

并行化集合是通过在驱动程序(Scala )中的现有集合上调用SparkContextparallelize方法来创建的Seq。集合的元素被复制以形成可以并行操作的分布式数据集。例如,这里是如何创建一个包含数字 1 到 5 的并行化集合:

val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)

创建后,distData可以并行操作分布式数据集 ( )。例如,我们可能会调用distData.reduce((a, b) => a + b)将数组的元素相加。稍后我们将描述分布式数据集上的操作。

并行集合的一个重要参数是将数据集切割成的分区。Spark 将为集群的每个分区运行一个任务。通常,集群中的每个 CPU 需要 2-4 个分区。通常,Spark 会尝试根据您的集群自动设置分区数。但是,您也可以通过将其作为第二个参数传递给parallelize(例如sc.parallelize(data, 10))来手动设置它。注意:代码中的某些地方使用术语切片(分区的同义词)来保持向后兼容性。

外部数据集

Spark 可以从 Hadoop 支持的任何存储源创建分布式数据集,包括本地文件系统、HDFS、Cassandra、HBase、Amazon S3等。Spark 支持文本文件、SequenceFiles和任何其他 Hadoop InputFormat

可以使用SparkContexttextFile方法创建文本文件 RDD 。此方法需要一个URI的文件(本地路径的机器上,或一个hdfs://s3a://等URI),并读取其作为行的集合。这是一个示例调用:

val distFile = sc.textFile("data.txt")

使用 Spark 读取文件的一些注意事项:

  • 如果使用本地文件系统上的路径,则该文件也必须可以在所有工作节点上的相同路径上访问。要么将文件复制到所有工作节点,要么使用网络安装的共享文件系统。

  • Spark 的所有基于文件的输入方法,包括textFile,都支持在目录、压缩文件和通配符上运行。例如,你可以使用textFile("/my/directory")textFile("/my/directory/*.txt")textFile("/my/directory/*.gz")。当读取多个文件时,分区的顺序取决于文件从文件系统返回的顺序。例如,它可能会也可能不会遵循文件的字典顺序(按路径)。在分区内,元素根据它们在底层文件中的顺序进行排序。

  • textFile方法还采用可选的第二个参数来控制文件的分区数。默认情况下,Spark 为文件的每个块创建一个分区(在 HDFS 中默认块为 128MB),但您也可以通过传递更大的值来请求更多的分区。请注意,分区数不能少于块数

 

除了文本文件,Spark 的 Scala API 还支持其他几种数据格式:

  • SparkContext.wholeTextFiles允许您读取包含多个小文本文件的目录,并将每个文件作为(文件名、内容)的二元组对返回。与textFile对比,后者将在每个文件中的每行的一条记录返回。分区由数据本地性决定,在某些情况下,这可能导致分区太少(本地数据较少)。对于这些情况,wholeTextFiles提供可选的第二个参数来控制最小分区数。

  • 对于SequenceFiles(K,V存储格式的文件),使用 SparkContext 的sequenceFile[K, V]方法,其中KV是文件中键和值的类型。这些应该是 Hadoop 的Writable接口的子类,如IntWritableText。此外,Spark 允许您为一些常见的 Writable 指定基础类型;例如,sequenceFile[Int, String]会自动读取 IntWritables 和 Texts。

  • 对于其他 Hadoop InputFormats,您可以使用该SparkContext.hadoopRDD方法,该方法采用任意JobConf输入格式类、键类和值类。以与使用输入源的 Hadoop 作业相同的方式设置这些。您还可以使用SparkContext.newAPIHadoopRDD基于“新”MapReduce API ( org.apache.hadoop.mapreduce) 的InputFormats 。

  • RDD.saveAsObjectFileSparkContext.objectFile支持,用序列化的 Java 对象,这种简单格式来组成RDD,并用来保存RDD。虽然这不如 Avro 之类的专用格式有效,但它提供了一种保存任何 RDD 的简单方法。

 

RDD 操作

RDD 支持两种类型的操作:

transforms(转换)它从现有的数据集创建一个新的数据集

actions(行动),它在对数据集运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值