算子的含义

 

Transform: 1. map:rdd中的每项数据进行map里的操作后,会形成一个个新的元素的新rdd flatMap:在map的基础上进行扁平化,形成一个新的rdd

2. distinct:转换操作,去重 filter:对rdd中的元素进行过滤 filterByRange:范围过滤,作用于键值对RDD,对RDD中元素进行过滤,返回键在指定范围内的元素

3. union:并集操作,不去重 intersection:交集操作,去重 subtract:类似intersection,返回在rdd中出现并且不在otherRdd中出现的元素 subtractByKey:与subtract类似,只不过这里是针对key的,返回在主RDD中出现并且不在otherRDD中出现的元素

4. join:相当于sql中的内联,只返回两个RDD根据key关联上的结果 leftOuterJoin:相当于sql中的左外关联,返回结果以前面的RDD为主,关联不上的记录为空 rightOuterJoin:相当于sql中的右外关联,返回结果以后面的RDD为主,关联不上的记录为空 cartesian:做笛卡尔积

5. cogroup:将输入的数据集(k,v)和另外的数据集(k,w)进行cogroup,得到的数据集是(k,Seq(v),Seq(w))的数据集 groupBy:接收一个函数,这个函数的返回值作为key,然后通过key对里面的元素进行分组 groupByKey:会对每一个RDD中的value聚合成一个序列,此操作发生在reduce端,所以势必所有的数据 将会通过网络传输,造成不必要的浪费,同时如果数据量十分大,可能还会造成OutOfMemoryError

6. reduceByKey:会在结果发送至reduce之前,会对每个mapper在本地进行merge,有点类似于MapReduce的combiner。 这样做的好处是在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的计算出结果 reduceByKeyLocally:对RDD中的每个k对应的v值根据映射函数来计算,运算结果映射到Map[k,v],而不是RDD[k,v]

7. mapPartitions:与map函数类似,只不过映射函数的参数由RDD的每一个元素变成了RDD中每一个分区的迭代(如果在映射过程中 需要频繁创建额外的对象,使用mapPartitions要比map高效,比如将RDD中所有数据通过JDBC写入数据库,如果使用map, 可能每个元素都要创建一个connection,这样开销很大,如果使用mapPartitions,那么只需要针对每一个分区建立一个connection) mapPartitionsWithIndex:函数作用同mapPartitions,不过提供了两个参数,第一个参数为分区的索引

。 8. zip:用于两个RDD组合成Key/Value形式的RDD,默认两个RDD的partition的数量以及元素的数量相同,否则会抛出异常 zipPartitions:将多个RDD按照partition组合成新的RDD,该函数需要组合的RDD具有相同的分区数,但对于每个分区内的元素数量没有要求(三个参数,大致三类实现)

9. zipWithIndex:将RDD中的元素和这个元素在RDD中的ID(索引号)组合成键值对 zipWithUniqueId:将RDD中的元素和一个唯一ID组合成键值对(该唯一ID生成算法: 每个分区中第一个元素的唯一ID值为:该分区索引号, 每个分区中第N个元素的唯一ID值为:(前一个元素的唯一ID值) + (该RDD总的分区数))

10. randomSplit:根据weights权重,将一个RDD切分成多个RDD,权重参数是一个Double数组

11. glom:将RDD中每一个分区中类型为T的元素转换成Array[T],这样每个分区就只有一个数组元素

12. coalesce:用于将RDD重新分区,使用HashPartitioner,第一个为重新分区的数目,第二个为是否进行shuffle,默认是false repartition:该函数是coalesce函数的第二个参数为true的实现

13. combineByKey:用于将RDD[K,V]转换成RDD[K,C],V和C的类型可相同可不同 第一个参数x:原封不动的取出来,第二个参数是函数:局部运算,第三个参数是函数:对局部运算后的结果在做运算 每个分区中每个key的value中的第一个值:(hello,1)(hello,1)(good,1)-->(hello(1,1),good(1))-->x就相当于hello的第一个1, good中的1 参数(createCombiner:组合器函数,用于将V类型转换成C类型,输入参数为RDD[K,V]中的V,输出为C mergeValue:合并值函数,将一个C类型和一个V类型值合并成一个C类型,输入参数为(C,V),输出为C mergeCombiners:合并组合器函数,用于将两个C类型值合并成一个C类型,输入参数为(C,C),输出为C numPartitions:结果RDD分区数,默认保持原有的分区数 partitioner:分区函数,默认为HashPartitioner mapSideCombine:是否需要在Map端进行combine操作,类似于MapReduce中的combine,默认为true) foldByKey:该函数用于RDD[K,V]根据K将V做折叠、合并处理,其中的参数zeroValue表示先根据映射函数将zeroValue应用于V, 进行初始化V,再将映射函数应用于初始化后的V. aggregateByKey:aggregate针对于序列操作,aggregateByKey针对于K,V操作,可以先进行局部操作,在进行全局操作 从源码可看出,aggregateByKey调用的就是combinByKey方法

14. partitionBy:根据partitioner函数生成新的ShuffleRDD,将原RDD重新分区

15. mapValues:同map,只不过mapValues针对的是[K,V]中的V进行map操作 flatMapValues:同flatMap,只不过flatMapValues是针对[K,V]中的V值进行flatMap操作,根据V去扁平化

16. foreachRDD:sparkStreaming中的转换算子,处理每一个时间段内的RDD数据。

17. persist:将一个RDD进行缓存,这样以后就不需要再重新计算,大大节省了程序运行时间,可以设置缓存级别 cache:调用了persist,且只有一个MEMORY_ONLY缓存级别

18. sample:抽样,返回RDD的抽样子集,false元素不可以多次抽样,true可以多次 (元素不可以多次抽样:withReplacement=false,每个元素被抽取到的概率为0.5:fraction=0.5 元素可以多次抽样:withReplacement=true,每个元素被抽取到的期望次数为2:fraction=2) takeSample:返回一个Array[T],该方法仅在预期结果数组很小的情况下使用,因为所有数据都被加载到driver的内存中。 (当不可以多次抽样:withReplacement=false;样本个数num大于父本个数时,只能返回父本个数 当不可以多次抽样:withReplacement=false;样本个数num小于父本个数时,返回样本个数 当可以多次抽样:withReplacement=true;样本个数num大于父本个数时,返回样本个数 当不可以多次抽样:withReplacement=true;样本个数num小于父本个数时,返回样本个数) Action: 1. sortBy:排序,有shuffle,默认是true升序,可以按照k或者v进行排序 sortByKey:排序,有shuffle,默认是true升序,按照k进行排序 2. aggregate:用户聚合RDD中的元素,先使用seqOp将RDD中每个分区的T类型元素聚合成U类型,再使用combOp 将之前每个分区聚合后的U类型聚合成U类型,特别注意seqOp和combOp都会使用zeroValue的值,zeroValue的类型为U fold:是aggregate的简化,将aggregate中的seqOp和combOp使用同一个函数Op 3. lookup:用于(K,V)类型的RDD,指定K值,返回RDD中该K对应的所有V值 4. collectAsMap:List集合转成Map集合(List(("a", 1), ("b", 2))=>Map(b -> 2, a -> 1))

5. countByKey:计算key的数量 countByValue:计算value的数量 6. froeach:foreach也是对每个partition中的iterator时行迭代处理,通过用户传入的function(即函数f)对iterator进行内容的处理, 而不同的是,函数f中的参数传入的不再是一个迭代器,而是每次的foreach得到的一个rdd的kv实例,也就是具体的数据 foreachPartition:是对每个partition中的iterator时行迭代的处理.通过用户传入的function(即函数f)对iterator进行内容的处理, 源码中函数f传入的参数是一个迭代器,也就是说在foreachPartiton中函数处理的是分区迭代器,而非具体的数据,不会生成一个新的RDD 7. keys:RDD[K,V],打印key values:RDD[K,V],打印value 8. keyBy:以传入的参数作为key(以单词的第一个字母:rdd

19.keyBy(_ (0)).collect() => ArrayBuffer((d,dog), (s,salmon)) 9. count:返回RDD中的元素数量。 reduce:根据映射函数f,对RDD中的元素进行二元计算,返回计算结果。 collect:用于将一个RDD转换成数组。

10. first:返回RDD中的第一个元素,不排序。 take:用于获取RDD中从0到num-1下标的元素,不排序。 top:用于从RDD中,按照默认(降序)或者指定的排序规则,返回前num个元素。 takeOrdered:和top类似,只不过以和top相反的顺序返回元素。

11. saveAsTextFile:用于将RDD以文本文件的格式存储到文件系统中,只会保存在Executor所在机器的本地目录。 saveAsSequenceFile:用于将RDD以SequenceFile的文件格式保存到HDFS上. saveAsObjectFile:用于将RDD中的元素序列化成对象,存储到文件中。对于HDFS,默认采用SequenceFile保存。

12. saveAsHadoopFile:将RDD存储在HDFS上的文件中,支持老版本Hadoop API,可以指定outputKeyClass、outputValueClass以及压缩格式。 saveAsHadoopDataset:用于将RDD保存到除了HDFS的其他存储中,比如HBase。 (在JobConf中,通常需要关注或者设置五个参数:文件的保存路径、key值的class类型、value值的class类型、RDD的输出格式(OutputFormat)、以及压缩相关的参数。)

13. saveAsNewAPIHadoopFile:用于将RDD数据保存到HDFS上,使用新版本Hadoop API。 saveAsNewAPIHadoopDataset:采用新版本Hadoop API。
 

<think>好的,我现在需要解释Halcon中GetWindowExtents算子的参数含义。用户之前已经询问过如何居中显示图像,现在他们可能在使用过程中遇到了需要更详细理解这个算子的参数的情况。 首先,我应该回忆一下GetWindowExtents的具体用法。根据之前的回答,这个算子用于获取窗口的尺寸,可能包括位置和大小。现在需要明确每个参数的作用。Halcon的文档是主要参考,但可能需要结合自己的使用经验。 接下来,参数顺序是关键。Halcon中的算子通常有输入和输出参数,输出参数一般是放在后面的。对于GetWindowExtents,用户提供的参数是WindowHandle,然后是四个输出参数,可能对应窗口的左上角坐标和宽高。需要确认参数的顺序是否正确。 然后,要解释每个参数的意义。比如,Row1对应窗口左上角的行坐标(Y轴),Column1对应列坐标(X轴),然后是Row2和Column2,或者可能Row2和Column2是右下角的坐标?或者可能第三第四个参数是宽度和高度?需要确认这点,可能我之前在回答时把参数写成了WindowWidth和WindowHeight,但实际上Halcon的参数可能返回的是右下角的坐标,或者直接宽高。 这时候可能需要查阅Halcon的官方文档或者函数定义。假设文档中说明GetWindowExtents返回的是窗口的位置和尺寸,那么参数可能依次是:窗口句柄,然后是Row1(左上角Y),Column1(左上角X),Row2(右下角Y),Column2(右下角X)。或者,可能返回的是左上角坐标和宽高,这需要确认。 例如,根据Halcon的文档,get_window_extents的参数是WindowHandle, Row, Column, Width, Height。这样的话,用户之前的代码中的参数可能有误。比如用户之前的代码是get_window_extents(WindowHandle, _, _, WindowWidth, WindowHeight),可能第三和第四个参数是Row和Column,被忽略,然后得到的是Width和Height。但如果是这样的话,之前的回答中的参数顺序有误,需要纠正。 这时候,我需要检查之前的回答是否存在错误,并在当前回答中修正。用户现在的问题直接涉及这个算子,所以必须准确。如果之前的回答中参数顺序有误,需要在此指出并纠正,避免用户混淆。 接下来,正确的参数顺序应该是:get_window_extents(WindowHandle, Row, Column, Width, Height),其中Row和Column是窗口左上角在屏幕上的坐标,Width和Height是窗口的尺寸。因此,用户在之前的代码中可能错误地忽略了前两个参数,而使用了第三和第四个参数作为宽高。这会导致错误的结果,因为如果窗口的位置不在原点,得到的宽高可能不正确。 因此,在解释参数时,需要明确每个参数的含义,并指出在居中计算时是否需要使用宽高,而忽略位置参数。例如,在之前的居中示例中,用户可能只需要窗口的Width和Height,所以用下划线忽略前两个参数,这是正确的做法,但需要明确说明。 最后,总结参数含义,强调各个参数的作用,并提醒用户在使用时注意参数的顺序和实际需求,是否需要获取窗口的位置或仅尺寸。同时,可能给出示例代码,说明如何正确使用该算子获取所需参数。</think>在Halcon中,`get_window_extents` 算子用于获取窗口的**屏幕位置**和**物理尺寸**,其参数含义如下: --- ### **算子原型**: ```halcon get_window_extents(WindowHandle, Row, Column, Width, Height) ``` --- ### **参数详解**: | 参数 | 方向 | 单位 | 说明 | |---------------|--------|--------|----------------------------------------------------------------------| | `WindowHandle`| 输入 | - | 窗口句柄(必须已通过`dev_open_window`等算子创建) | | `Row` | 输出 | 像素 | 窗口**左上角**在屏幕坐标系中的**垂直坐标**(Y轴,向下为正) | | `Column` | 输出 | 像素 | 窗口**左上角**在屏幕坐标系中的**水平坐标**(X轴,向右为正) | | `Width` | 输出 | 像素 | 窗口的**实际物理宽度**(包含边框和标题栏) | | `Height` | 输出 | 像素 | 窗口的**实际物理高度**(包含边框和标题栏) | --- ### **使用示例**: ```halcon dev_open_window(0, 0, 800, 600, 'black', WindowHandle) // 创建窗口 get_window_extents(WindowHandle, Ypos, Xpos, WinWidth, WinHeight) // 输出:Ypos=0, Xpos=0, WinWidth=800, WinHeight=600 ``` --- ### **应用场景**: 1. **居中显示图像**(如之前问题): ```halcon // 仅获取窗口尺寸(忽略位置) get_window_extents(WindowHandle, _, _, WinWidth, WinHeight) ``` 2. **多窗口对齐**: ```halcon // 获取主窗口位置,用于定位子窗口 get_window_extents(MainWindow, MainY, MainX, _, _) dev_open_window(MainY+100, MainX+100, 400, 300, 'gray', SubWindow) ``` --- ### **注意要点**: - 📌 参数`Width/Height`包含窗口边框和标题栏,若需获取**绘图区域**尺寸,请使用: ```halcon get_window_extents(WindowHandle, _, _, TotalWidth, TotalHeight) get_window_par(WindowHandle, 'win_width', DrawWidth) // 绘图区宽度 get_window_par(WindowHandle, 'win_height', DrawHeight) // 绘图区高度 ``` - ⚠️ 屏幕坐标系以**左上角为原点**(Y轴向下),与图像坐标系一致。 通过合理利用这些参数,可以实现精确的窗口布局控制和图像显示定位。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值