spark graphx java判断是否有环

正在播放:11月13日第21期:源码解析Spark Graphx的内幕
下载学院APP缓存视频离线看
1269次播放
记录时间点
我的笔记同学的笔记
我的问题同学的问题Spark Graphx 构建graph和aggregateMessages聚合消息
Graphx:构建graph和聚合消息
最近在优化kcore算法时,对Graphx代码看了几遍。1.2后Graphx性能有所提升,代码不太容易理解,现在用图表示出来会更直观。
对数学上的图有点印象的是x轴、y轴坐标图,坐标中每个点用横坐标x和纵坐标y表示,即: (x1, y1), (x2, y2), 一个坐标点可以确定一个点的唯一位置
Graphx与上面的概念类似。不同的是, Graphx中的点概念更泛化,不一定用x y坐标表示,有唯一标示的对象即可,如:ID
graphx的Graph对象是用户操作图的入口, 它包含了边(edge)和顶点(vertices)两部分. 边由点组成,所以, 所有的边中包含的点的就是点的全集。但是这个全集包含重复的点, 去重复后就是VertexRDD
点和边都包含一个attr属性,可以携带额外信息
构建一个图的方法
根据边构建图(Graph.fromEdges)
def fromEdges[VD: ClassTag, ED: ClassTag](
edges: RDD[Edge[ED]],
defaultValue: VD,
edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, ED]
根据边的两个点元数据构建(Graph.fromEdgeTuples)
def fromEdgeTuples[VD: ClassTag](
rawEdges: RDD[(VertexId, VertexId)],
defaultValue: VD,
uniqueEdges: Option[PartitionStrategy] = None,
edgeStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY,
vertexStorageLevel: StorageLevel = StorageLevel.MEMORY_ONLY): Graph[VD, Int] =
第一步:构建边EdgeRDD
(点击查看大图)
加载边的文本信息
从持久化系统(HDFS)中加载边的文本信息,按行处理生成tuple, 即(srcId, dstId)
val rawEdgesRdd: RDD[(Long, Long)] = sc.textFile(input, partitionNum).filter(s =& s != &0,0&).repartition(partitionNum).map {
case line =&
val ss = line.split(&,&)
val src = ss(0).toLong
val dst = ss(1).toLong
if (src & dst)
(src, dst)
(dst, src)
}.distinct()
数据形如:
第二步:初步生成Graph
入口:Graph.fromEdgeTuples(rawEdgesRdd)
元数据为,分割的两个点ID,把元数据映射成Edge(srcId,
dstId, attr)对象, attr默认为null。这样元数据就构建成了RDD[Edge[ED]]
RDD[Edge[ED]]要进一步转化成EdgeRDDImpl[ED,
首先遍历RDD[Edge[ED]]的分区partitions,对分区内的边重排序new
Sorter(Edge.edgeArraySortDataFormat[ED]).sort(edgeArray, 0, edgeArray.length, Edge.lexicographicOrdering)即:按照srcId从小到大排序。
问:为何要重排序?
答:为了遍历时顺序访问。采用数组而不是Map,数组是连续的内存单元,具有原子性,避免了Map的hash问题,访问速度快
填充localSrcIds,localDstIds, data, index, global2local, local2global, vertexAttrs
数组localSrcIds,localDstIds中保存的是经过global2local.changeValue(srcId/dstId)转变的本地索引,即:localSrcIds、localDstIds数组下标对应于分区元素,数组中保存的索引位可以定位到local2global中查到具体的VertexId
global2local是spark私有的Map数据结构GraphXPrimitiveKeyOpenHashMap,
保存vertextId和本地索引的映射关系。global2local中包含当前partition所有srcId、dstId与本地索引的映射关系。
data就是当前分区的attr属性数组
index索引最有意思,按照srcId重排序的边数据, 会看到相同的srcId对应了不同的dstId,
见图中index desc部分。index中记录的是相同srcId中第一个出现的srcId与其下标。
local2global记录的是所有的VertexId信息的数组。形如:srcId,dstId,srcId,dstId,srcId,dstId,srcId,dstId。其中会包含相同的ID。即:当前分区所有vertextId的顺序实际值
# 根据本地下标取VertexId
localSrcIds/localDstIds -& index -& local2global -& VertexId
# 根据VertexId取本地下标,取属性
VertexId -& global2local -& index -& data -& attr object
spark的数据最终是在patition中表达,所以各种transform都在这里进行,这里的数据结构性能至关重要
第二步:构建顶点(VertexRDD)
(点击查看大图)
入口:GraphImpl365行。&val
vertices = VertexRDD.fromEdges(edgesCached, edgesCached.partitions.size, defaultVertexAttr).withTargetStorageLevel(vertexStorageLevel)
根据边EdgeRDD[ED, VD]构建出点VertexRDD,
点是孤岛,不像边一样保存点与点之间的关系。点只保存属性attr。所以需要对拿到的点做分区。
为了能通过点找到边,每个点需要保存点所在到边信息即分区Id(pid),这些新保存在路由表RoutingTablePartition中。
构建的过程:
创建路由表
根据EdgeRDD,map其分区,对edge partition中的数据转换成RoutingTableMessage数据结构。
特别激动的是:&为节省内存,把edgePartitionId和一个标志位通过一个32位的int表示。
如图所示,RoutingTableMessage是自定义的类型类, 一个包含vid和int的tuple(VertexId,
Int)。 int的32~31位表示一个标志位,01: isSrcId 10: isDstId。30~0位表示边分区ID。赞这种做法,目测作者是山西人。
RoutingTableMessage想表达这样的信息:一个顶点ID,不管未来你到天涯海角,请带着你女朋友Edge的地址:
edge分区ID。并且带着一个标志你在女友心中的位置是:01是左边isSrcId,10是右边isDstId。这样就算你流浪到非洲,也能找到小女友约会...blabla...
根据路由表生成分区对象vertexPartitions
上(1)中生成的消息路由表信息,重新分区,分区数目根edge分区数保持一致。
在新分区中,map分区中的每条数据,从RoutingTableMessage解出数据:vid, edge pid, isSrcId/isDstId。这个三个数据项重新封装到三个数据结构中:pid2vid,srcFlags,dstFlags
有意思的地方来了,想一下,shuffle以后新分区中的点来自于之前edge不同分区,那么一个点要找到边,就需要先确定边的分区号pid, 然后在确定的edge分区中确定是srcId还是dstId, 这样就找到了边。
val pid2vid = Array.fill(numEdgePartitions)(new PrimitiveVector[VertexId])
val srcFlags = Array.fill(numEdgePartitions)(new PrimitiveVector[Boolean])
val dstFlags = Array.fill(numEdgePartitions)(new PrimitiveVector[Boolean])
上面表达的是:当前vertex分区中点在edge分区中的分布。新分区中保存这样的记录(vids.trim().array, toBitSet(srcFlags(pid)),
toBitSet(dstFlags(pid)))&vid, srcFlag, dstFlag, flag通过BitSet存储,很省。
如此就生成了vertex的路由表routingTables
生成ShippableVertexPartition
根据上面routingTables, 重新封装路由表里的数据结构为:ShippableVertexPartition
ShippableVertexPartition会合并相同重复点的属性attr对象,补全缺失的attr对象。
关键是:根据vertexId生成map:GraphXPrimitiveKeyOpenHashMap,这个map跟边中的global2local是不是很相似?这个map根据long
vertxId生成下标索引,目测:相同的点会有相同的下标。// todo..
创建VertexRDDImpl对象
new VertexRDDImpl(vertexPartitions),这就完事了
第三步 生成Graph对象[finished]
(点击查看大图)
把上述edgeRDD和vertexRDD拿过来组成Graph
new GraphImpl(vertices, new ReplicatedVertexView(edges.asInstanceOf[EdgeRDDImpl[ED, VD]]))
常用函数分析
下面分析一下常用的graph函数aggregateMessages
aggregateMessages
aggregateMessages是Graphx最重要的API,1.2版本添加的新函数,用于替换mapReduceTriplets。目前mapReduceTriplets最终也是使用兼容的aggregateMessages
据说改用aggregateMessages后,性能提升30%。
它主要功能是向邻边发消息,合并邻边收到的消息,返回messageRDD
aggregateMessages的接口如下:
def aggregateMessages[A: ClassTag](
sendMsg: EdgeContext[VD, ED, A] =& Unit,
mergeMsg: (A, A) =& A,
tripletFields: TripletFields = TripletFields.All)
: VertexRDD[A] = {
aggregateMessagesWithActiveSet(sendMsg, mergeMsg, tripletFields, None)
sendMsg: 发消息函数
private def sendMsg(ctx: EdgeContext[KCoreVertex, Int, Map[Int, Int]]): Unit = {
ctx.sendToDst(Map(ctx.srcAttr.preKCore -& -1, ctx.srcAttr.curKCore -& 1))
ctx.sendToSrc(Map(ctx.dstAttr.preKCore -& -1, ctx.dstAttr.curKCore -& 1))
mergeMsg:合并消息函数。用于Map阶段,每个edge分区中每个点收到的消息合并,以及reduce阶段,合并不同分区的消息。合并vertexId相同的消息
tripletFields:定义发消息的方向
aggregateMessages Map阶段
(点击查看大图)
从入口函数进入aggregateMessagesWithActiveSet,首先使用VertexRDD[VD]更新replicatedVertexView,
只更新其中vertexRDD中attr对象。
问:为啥更新replicatedVertexView? 答:replicatedVertexView就是个点和边的视图,点的属性有变化,要更新边中包含的点的attr
replicatedVertexView这里对edgeRDD做mapPartitions操作,所有的操作都在每个边分区的迭代中完成。
进入aggregateMessagesEdgeScan
前文中提到edge partition中包含的五个重要数据结构之一:localSrcIds, 顶点vertixId在当前分区中的索引.
遍历localSrcIds, 根据其下标去localSrcIds中拿到srcId在全局local2global中的索引位,然后拿到srcId;
同理,根据下标,去localDstIds中取到local2global中的索引位,
有了srcId和dstId,你就可以blabla....
问: 为啥用localSrcIds的下标
答: 用localDstIds的也可以。一条边必然包含两个点:srcId, dstId
根据接口中定义的tripletFields,拿到发消息的方向: 1) 向dstId发;2) 向srcId发;3) 向两边发;4) 向其中一边发
发消息的过程就是遍历到一条边,向以srcId/dstId在本分区内的本地IDlocalId为下标的数组中添加数据,如果localId为下标数组中已经存在数据,则执行合并函数mergeMsg
每个点之间在发消息的时候是独立的,即:点单纯根据方向,向以相邻点的localId为下标的数组中插数据,互相独立,在并行上互不影响。
完事,返回消息RDDmessages: RDD[(VertexId, VD2)]
aggregateMessages Reduce阶段
(点击查看大图)&
因为对边上,对点发消息,所以在reduce阶段主要是VertexRDD的菜。
入口(Graphmpl 260行):&vertices.aggregateUsingIndex(preAgg, mergeMsg)
收到messages: RDD[(VertexId, VD2)]消息RDD,开始:
对messages做shuffled分区,分区器使用VertexRDD的partitioner。
因为VertexRDD的partitioner根据点VertexID做分区,所以vertexId-&消息分区后的pid根VertextRDD完全相同,这样用zipPartitions高效的合并两个分区的数据
根据对等合并attr, 聚合函数使用API传入的mergeMsg函数
小技巧:遍历节点时,遍历messagePartition。并不是每个节点都会收到消息,所以messagePartition集合最小,所以速度会快。遍历小集合取大集合的数据。前文提到根据routingTables路由表生成VertexRDD的vertexPartitions时, vertexPartitions中重新封装了ShippableVertexPartition对象,其定义为:
ShippableVertexPartition[VD: ClassTag](
val index: VertexIdToIndexMap,
val values: Array[VD],
val mask: BitSet,
val routingTable: RoutingTablePartition)
最后生成对象:&new ShippableVertexPartition(map.keySet, map._values, map.keySet.getBitSet,
routingTable)
所以这里用到的index就是map.keySet, map就是映射vertexId-&attr
index: map.keySet, hashSet, vertexId-&下标
values: map._valuers, Array[Int], 根据下标保存attr。
so so,根据vetexId从index中取到其下标,再根据下标,从values中取到attr,存在attr就用API传入的函数mergeMsg合并属性
不存在就直接赋值。
最后得到的是收到消息的VertexRDD
到这里,整个map/reduce过程就完成了。
翠花,上全图
(点击查看大图)&
如果没有绕晕,从头再读一遍
------待续--------
文章出处:/shijinkui/spark_study/blob/master/spark_graphx_analyze.markdown
> 本站内容系网友提交或本网编辑转载,其目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请及时与本网联系,我们将在第一时间删除内容!
6. Spark GraphX Programming Guide 6.1 概述 GraphX是spark的一个新组件用于图和并行图计算.在一个高水平,GraphX通过引进一个新的图抽象扩展了spark RDD:带有顶点和边属性的有向多重图.为了支持图计算,GraphX 提供了很多基本的操作(像 subgraph, joinVertices, and agg ...
快刀初试:Spark GraphX在淘宝的实践作者:明风(本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版)
对于网络科学而言,世间万物都可以抽象成点,而事物之间的关系都可以抽象成边,并根据不同的应用场景,生成不同的网络,因此整个世界都可以用一个巨大的复杂网 ...
Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈
大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交网络.电子商务,地图等领域.对于图计算的两个核心问题:图存储模式和图计算模型,Spark GraphX给出了近乎完美的答案,
而Spar ...
&Spark GraphX 大规模图计算和图挖掘& /art/049.htm
http://www.csdn.net/article//2819023-Spark-Graphx
&Spark亚太研究院系列丛书——Spark实战高手之路 从零开始&
摘要 :本篇文档主要讲述如何使用GraphEdit来模拟构建graph图,测试你的filter. GraphEdit概述 GraphEdit是一个很有用的工具,可以用来构建graph图.通过GraphEdit,你可以在开发代码之前进行一下体验,你也可以装载一个你的 应用程序创建的Graph文件.如果你想开发一个自己的filter,GraphEdit 给你提供 ...
作者:智慧的鱼 摘要:本文主要讲述了Graph图构建过程中常用的技巧,主要的内容如下: ·如何根据CLSID向graph中添加filter ·如何查找filter空闲的pin ·如何连接两个Filter ·如何获得filter或者pin的接口指针 ·如何查找和某个filter的上下相连的filter ·如何删除graph中的所有filter ·如何利用Cap ...
摘要:本篇文档主要讲述了Graph图构建过程中常用的技巧 主要的内容如下: 1如何根据CLSID向graph中添加filter 2如何查找filter空闲的pin 3如何连接两个Filter 4如何获得filter或者pin的接口指针 5如何查找和某个filter的上下相连的filter 6如何删除graph中的所有filter 7如何利用Capture G ...
在GraphEdit中模拟构建Graph智慧的鱼(aoosang)摘要:本篇文档主要讲述如何使用GraphEdit来模拟构建graph图,测试你的filter.
1 GraphEdit概述
GraphEdit是一个很有用的工具,可以用来构建graph图.通过GraphEdit,你可以在开发代码之前进行一下体验,你也可以装载一个你的应用程序创建的Graph ...中国领先的IT技术网站
51CTO旗下网站
事实上,Spark是一项非常值得学习的技术
如今,诸如亚马逊、eBay和雅虎等公司都开始采用Spark技术。许多机构将Spark部署在上千个节点的集群中。事实上,Spark是一项非常值得学习的技术。
作者:来源:| 10:34
2013年年底,我第一次接触到Spark,当时我对Spark所使用的Scala语言产生了较大的兴趣。一段时间后,我做了一个预测泰坦尼克号船上人员生存概率的数据科学项目。事实证明这是一个更深入了解Spark概念和编程框架的绝佳途径。我强烈建议任何希望学习Spark的开发者都寻找一个项目入手。
如今,诸如亚马逊、eBay和雅虎等公司都开始采用Spark技术。许多机构将Spark部署在上千个节点的集群中。据Spark
FAQ中记录,已知的最大集群节点个数已超过8000。事实上,Spark是一项非常值得学习的技术。
本文主要介绍了Spark概念及一些实例。这些信息主要从Apache Spark网站和相关书籍中获取。
什么是Apache
正如广告所提到的,Spark是一个运算速度快如闪电的Apache项目。它有一个逐渐壮大的开源社区,同时它还是现今最热门的Apache项目。
Spark提供了一个运算速度快的一般化数据处理平台。Spark可以让你的程序提高100倍的内存计算速度,或者10倍的磁盘计算速度(Hadoop)。去年的Daytona
GraySort比赛中,Spark只用了Hadoop十分之一数量的机器就实现了其三倍多的速度。Spark已经成了处理PB级别数据运算速度最快的开源工具。
Spark还可以更加便捷地完成你的项目,为了更好地说明这个问题,我们首先看下如何实现大数据中的&Hello
World!&案例。用Java语言编写的MapReduce过程需要大约50行的代码,而利用Spark你只需要以下几行代码:
sparkContext.textFile(&hdfs://...&)&&&&&.flatMap(line&=&&line.split(&&&))&&&&&map(word&=&&(word,&1)).reduceByKey(_+_)&&&&&.saveAsTextFile(&hdfs://...&)&
学习如何使用Apache
Spark时,另一个重要的东西是其提供了脱机的交互式shell(REPL)。利用REPL,我们可以逐行检测代码是否有误。考虑到Spark较为简短的代码风格,这使得即时数据分析任务成了容易实现的事情。
此外,Spark还提供了其他的一些特性:
当前Spark提供了Scala、Java、Python和R的API接口
较好地整合了Hadoop生态系统和数据储存系统(HDFS, Amazon S3, HIVE, HBase, Cassandra等)
既可以在Hadoop YARN或者Apache Mesos等集群上运行,也可以单机运行。
Spark核心组件可以和其他一些高效的软件库无缝连接使用。这些软件库包括SparkSQL, Spark Streming,
MLlib(机器学习专用)和GraphX,下文将详细介绍这些组件。其他一些软件库和扩展功能目前正处于开发过程中。
Spark核心组件
Spark是处理大规模数据的并行分布式基础引擎。它主要负责以下几个功能:
内存管理和故障恢复
制定并管理集群中的任务
和数据储存系统交互
Spark引入了RDD(Resilient Distributed
Dataset)的概念,RDD是一个抽象的数据集,它提供对数据并行和容错的处理。我们可以通过加载外部数据集或从驱动程序集中切分得到一个可以包含任意类型项目的RDD。
RDD支持两种类型的运算:
数据转换(数据映射、过滤、合并等)在一个RDD上执行,而其结果被储存到另外一个RDD中。
数据运算(降维、计数等)则是通过在RDD中计算后才返回相应的结果。
Spark的数据转换过程并不是实时返回运算结果。实际上,该过程知识记录下需要执行的操作过程和相应的数据集。只有当执行数据运算过程且结果已经返回到驱动程序中时,Spark才执行数据转换进程。该设计使得Spark可以更高效地执行任务。例如,如果一个大型数据集被转换成许多子集并被传输到第一步的数据运算过程中,那么此时Spark只能处理并返回第一步的运算结果,并无法处理整个数据集的运算过程。
默认设定下,任何一个处理数据转换过程的RDD将会在每次处理完数据运算后被还原。然而,你也可以使用高速缓存的方法将RDD保存下来,此时Spark会将内容储存在集群中以便于下次更快捷地调用。
SparkSQL是Spark的一个组件,它可以利用SQL或者Hive查询语法来查询数据。它起先被视为MapReduce的替代方案,现今SparkSQL已被整合到Spark堆栈中。为了提供对更多数据类型的支持,它将SQL语句纳入系统中,这使其成为一个非常强大的工具。以下是Hive兼容查询语句的实例:
//&sc&is&an&existing&SparkContext&val&sqlContext&=&new&org.apache.spark.sql.hive.HiveCONTEXT(sc)&&sqlContext.sql(&CREATE&TABLE&IF&NOT&EXISTS&src&(key&INT,&value&STRING)&)&sqlContext.sql(&LOAD&DATA&LOCAL&INPATH&'examoles/src/main/resources/kvl.txt'&INTO&TABLE&src&)&&//&Queries&are&expressed&in&HiveQL&sqlContext.sql(&FROM&src&SELECT&key,&value&).collect().foreach(println)&
Spark Streaming
Streaming支持实时流式数据处理,比如Web服务器日志文件、Twitter等社交网络数据和类似Kafka的信息数据。Spark中,Spark
Streaming接收输入流数据并将其划分成小子集。接下来,如下图所示,这些数据被Spark引擎所处理并被整合成最终的结果。
Spark Streaming的API接口和Spark核心组件非常匹配,因此所有的编程人员可以轻易地处理流式数据。
MLlibMLlib是一个机器学习库,它提供了为大规模集群计算所设计的分类、回归、聚类和协同过滤等机器学习算法。其中一部分算法也适用于处理流式数据,比如普通线性二乘回归估计和k均值聚类算法。值得注意的是,Apache
Mahout(Hadoop的机器学习算法软件库)已经脱离MapReduce阵营转而投向Spark MLlib中。
GraphX是用于绘图和执行绘图并行计算的软件库,它为ETL(探索性分析和反复的绘图计算)提供了一套统一的工具。除了绘图操作技巧,它还提供了类似于PageRank的一般性绘图算法。
如何使用Apache Spark?
TwitterUtils.createStream(...)&&&&&.filter(_.getText.contains(&earthquake&)&||&_.getText.contains(&shaking&))&
现在我们已经回答了&什么是Apache
Spark?&这个问题,接下来让我们思考下Spark可以用来处理啥样的问题呢?
最近,我偶然看到一篇文章。文章中提到利用Twitter流式数据来检测地震。有趣的是,实验表明该技术可以比日本气象局更快地告知百姓地震的情况。即使他们在文章使用了不同的方法,但我认为这是一个很好的例子,它可以用来检验我们如何利用简化的片段代码而不使用粘接代码将Spark付诸实践。
首先,我们必须将与&地震&或者&抖动&有关的推文过滤出来。我们可以非常轻易地利用Spark Streaming来实现该目标:
TwitterUtils.createStream(...)&&&&&.filter(_.getText.contains(&earthquake&)&||&_.getText.contains(&shaking&))&
接下来我们可以对处理完的推文数据做一些语义分析,并判断是否能反映出当前的地震情况。比如,类似于&地震&或者&现在正在晃动!&的推文将被视为具有正效应,而类似于&参加地震会议。&或者&昨天的地震真恐怖。&则被视为无影响效应。文章作者利用支持向量机模型来实现该目标,我们将在
此基础上利用流式数据版本的模型来实现。下文是利用MLlib生成的代码示例:
&val&data&=&MLUtils.loadLibSVMFile(sc,&&sample_earthquate_tweets.txt&)&&&val&splits&=&data.randomSplit(Array(0.6,0.4),seed&=&11L)&val&training&=&split(0).cache()&val&test&=&splits(1)&&&val&numIterations&=&100&val&model&=&SVMWithSGD.train(training,&numIterations)&&&model.clearThreshold()&&&val&scoreAndLabels&=&test.map{point&=&&&&&&&val&score&=&model.predict(point.features)&&&&&(score,&point.label)}&&&val&metric&=&new&BinaryClassificationMetrics(scoreAndLabels)&val&auROC&=&metrics.areaUnderROC()&&println(&Area&under&ROC&=&&+&auROC)&
如果我们关注模型的预测准确率,那么我们可以进一步对检测到地震做出反应。需要注意的是,对于包含地理信息的推文,我们还可以获取震源位置。利用这个信息,我们可以通过SparkSQL从现有的Hive
table(储存需要接收地震提醒的用户信息)中提取出他们的邮箱地址并发送一封私人电子邮件:
&val&sqlContext&=&new&org.apache.spark.sql.hive.HiveContext(sc)&&sqlContext.sql(&FROM&earthquake_warning_users&SELECT&firstName,&lastName,&city,&email&)&&&&&.collect().foreach(sendEmail)&
Apache Spark的其他应用
除检测地震情况外,Spark还有许多潜在的应用。
以下是Spark在大数据中的部分应用:
1.在游戏领域中,从实时的潜在游戏事件中迅速地挖掘出有价值的模式可以创造出巨大的商业利益,比如用户返回率情况、如何制定定向广告以及如何自动调整游戏的复杂度等。
2.在电子商务领域中,实时交易数据将被传递到k均值算法或者ALS等协同过滤流算法中。这些运算结果将和顾客评论等非结构化数据结合起来,用于不断改进交易模式以适应新趋势的发展。
3.在金融或证券领域中,Spark堆栈技术可以被应用到信用诈骗和风险管控系统中。通过获取大量的历史数据和其他一些外泄数据以及一些连接/请求信息(IP地理信息或时间信息),我们可以取得非常好的模型结果。
总而言之,Spark帮助人们简化了处理大规模数据的步骤流程。不管是处理结构化还是非结构化数据,Spark将许多复杂的功能(比如机器学习算法和图算法)无缝地结合起来。Spark使得大量的从业者都可以进行大数据分析,让我们一探究竟吧!
原文作者:RADEK OSTROWSKI
译者:Fibears【编辑推荐】【责任编辑: TEL:(010)】
大家都在看猜你喜欢
热点热点热点热点热点
24H热文一周话题本月最赞
讲师:5人学习过
讲师:1人学习过
讲师:4人学习过
精选博文论坛热帖下载排行
本书分为8章,首先介绍ASP.NET的开发技巧和重点技术,尤其针对初学者如何快速入门并掌握ASP.NET编程做了深入浅出的介绍;然后重点介绍ASP.N...
订阅51CTO邮刊第21期:源码解析Spark GraphX_土豆_高清视频在线观看(window.slotbydup=window.slotbydup || []).push({
id: '2014386',
container: s,
size: '234,60',
display: 'inlay-fix'
&&|&&0次下载&&|&&总25页&&|
您的计算机尚未安装Flash,点击安装&
如需下载到电脑,请使用积分()
相关分类推荐
0人评价3页
0人评价3页
0人评价32页
0人评价32页
0人评价104页
所需积分:(友情提示:所有文档均可免费全文预览!下载之前请务必先预览阅读,以免误下载造成积分浪费!)
(多个标签用逗号分隔)
文不对题,内容与标题介绍不符
广告内容或内容过于简单
文档乱码或无法正常显示
若此文档涉嫌侵害了您的权利,请参照说明。
评价文档:}

我要回帖

更多关于 spark graphx python 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信