Spark 技术:大数据的背景

131 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

随着科技发展,数据正在以前所未有的速度生长,让企业更好地了解客户,对决策进行指导,以及改善业务流程。大数据技术正在成为各行各业的必备技术,为企业提供了更多的商机。

Spark是一种快速、通用的大数据处理引擎,它可以让用户以高性能的方式处理各种数据,例如流式数据、格式化数据、结构化数据和半结构化数据。Spark技术可以改善大数据分析的性能,使企业以不同的方式解决问题,提高企业竞争力。

它可以有效地解决传统数据处理方法无法解决的问题,例如处理大规模数据集、复杂数据结构、多种数据源等。它支持流式处理、机器学习、图计算等多种功能,能够更快更有效地处理大数据,使企业更快实现业务成果。

企业可以根据自身需要,在不改变原有系统架构的基础上,添加新的节点,以满足更大规模的数据处理需求。Spark技术是大数据处理领域的重要技术,它可以改善大数据处理的性能,帮助企业获得更好的业务结果。

Spark的实战应用可以覆盖众多领域,例如:数据仓库、机器学习、人工智能、实时流式处理等。比如,在数据仓库方面,Spark可以帮助企业以更快的速度分析大规模的数据集,从而更好地了解客户,改善业务流程;在机器学习方面,Spark可以加速模型训练,提高模型处理准确性;在实时流式处理方面,Spark可以实现实时分析,帮助企业做出及时的决策。

RDD常见操作

1.转换操作(Transformation)

对一个数据为{1,2,3,3}的RDD进行基本的RDD转换操作

函数名目的示例结果
map()将函数应用于RDD中的每个元素,将返回值构成新的RDDrdd.map(x => x + 1){2, 3, 4, 4}
flatMap()将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD。通常用来切分单词。map+拍扁rdd.flatMap(x => x.to(3)){1, 2, 3,2,3,3,3}
filter()返回一个由通过传给filter()的函数的元素组成RDDrdd.filter(x => x != 1){2,3,3}
distinct()去重rdd.distinct(){1,2,3}
sample(withReplacement,fraction,[seed])对RDD采样,以及是否替换rdd.sample(false,0.5)非确定的

对数据分别为{1,2,3}和{3,4,5}的RDD进行针对两个RDD的转化操作

函数名目的示例结果
union()生成一个包含两个RDD中所有元素的RDD(并集)rdd.union(other){1,2,3,3,4,5}
intersection()求两个RDD共同元素的RDD(交集)rdd.intersection(other){3}
subtract()移除一个RDD中的内容(例如移除训练数据)rdd.subtract(other){1,2}
cartesian()与另一个RDD的笛卡尔积rdd.cartesian(other){(1,3),(1,4),…,(3,5)}

2.行动操作(Action)

对一个数据为{1,2,3,3}的RDD进行基本的RDD行动操作

函数名目的示例结果
collect()返回RDD中的所有元素rdd.collect(){1,2,3,3}
count()RDD中的元素个数rdd.count()4
countByValue()各元素在RDD中出现的次数rdd.countByValue(){(1,1),(2,1),(3,2)}
take(num)从RDD中返回num个元素rdd.take(2){1,2}
top(num)从RDD中返回最前面的num个元素rdd.top(2){3,3}
takeOrdered(num)(ordering)从RDD中按照提供的顺序返回最前面的num个元素rdd.takeOrdered(2)(myOrdering){3,3}
takeSample(withReplacement,num,[seed])从RDD中返回任意一些元素rdd.takeSample(false,1)非确定性
reduce(func)并行整合RDD中所有数据(例如sum)rdd.reduce((x, y) => x + y)9
fold(zero)(func)和reduce()一样,但是需要提供初始值rdd.fold(0)((x, y) => x + y)9
aggregate(zeroValue)(seqOp,combOp)和reduce相似,但是通常返回不同类型的函数rdd.aggregate((0, 0))((x, y) => (x._1 + y, x._2 + 1),(x, y) => (x._1 + y._1, x._2 + y._2))(9,4)
foreach(func)对RDD中的每个元素使用给定的函数rdd.foreach(func)

Pair RDD常见操作

Pair RDD的转换操作(以键值对集合{(1, 2), (3, 4), (3, 6)}为例)

函数名目的示例结果
reduceByKey(func)合并具有相同的键的值rdd.reduceByKey((x, y) => x + y){(1,2),(3,10)}
groupByKey()对具有相同键的值进行分组rdd.groupByKey(){(1,[2]),(3,[4,6])}
combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner)使用不同的返回类型合并具有相同键的值
mapValues(func)对pair RDD中的每个值应用一个函数而不改变键rdd.mapValues(x => x + 1){(1, 3), (3, 5), (3, 7)}
flatMapValues(func)对pairRDD中的每个值应用一个返回迭代器的函数,然后对返回的每个元素都生成一个对应原键的键值对记录。通常用户符号化rdd.flatMapValues( x => (x to 5)){(1,2),(1,3),(1,4),(1,5),(3,4),(3,5)}
keys()返回一个仅包含键的RDDrdd.keys{1,3,3}
values()返回一个仅包含值的RDDrdd.values{2,4,6}
sortByKey()返回一个根据键排序的RDDrdd.sortByKey(){(1, 2), (3, 4), (3, 6)}

针对两个pair RDD的转换操作(rdd = {(1, 2), (3, 4), (3, 6)} other={(3,9)})

函数名目的示例结果
subtractByKey删掉RDD中键与other RDD中的键相同的元素rdd.subtractByKey(other){(1,2)}
join对两个RDD进行内连接rdd.join(other){(3, (4, 9)),(3,(6, 9))}
rightOuterJoin对两个RDD进行连接操作,确保第一个RDD的键必须存在(右外连接)rdd.rightOuterJoin(other){(3,(Some(4),9)),(3,(Some(6),9))}
leftOuterJoin对两个RDD进行连接操作,确保第二个RDD的键必须存在(左外连接)rdd.leftOuterJoin(other){(1,(2,None)),(3,(Some(4),9)),(3,(Some(6),9)))}
cogroup将两个RDD中拥有相同键的数据分组到一起rdd.cogroup(other){(1,([2],[])),(3,([4,6],[9]))}

2.行动操作(Action)

和转换操作一样,所有基础RDD支持的传统行动操作也都在pair RDD上可用。

Pair RDD的行动操作(以键值对集合{(1, 2), (3, 4),(3, 6)}为例)

函数描述示例结果
countByKey()对每个键对应的元素分别计数rdd.countByKey(){(1, 1),(3, 2)}
collectAsMap()将结果以映射表的形式返回,以便查询rdd.collectAsMap()Map{(1,2),(3,6)}
lookup(key)返回给定键对应的所有值rdd.lookup(3)[4, 6]