比较Scala

时间:2016-08-26 19:43:53

标签: scala apache-spark dataframe dataset pyspark

我是Spark Scala的新手。我遇到的情况是我必须比较数据集中特定列的值,例如:

源数据

Source  Destination Distance
Austin  Houston     200
Dallas  Houston     400
Kansas  Dallas      700 

合力

Source1  Destination1   Distance1   Source2  Destination2 Distance2  DistDiff     
Dallas   Houston        400         Kansas   Dallas       700        300

根据情况,我必须比较后续行的距离,如果差异大于或等于300,则将记录保存在结果数据集中 700 - 400 = 300

我遇到的例子是具有在任何特定数据集上按行执行的函数,但我的方案是使用连续的行。

2 个答案:

答案 0 :(得分:2)

您提到可以按日期时间对行进行排序。因此,假设它使用sortBysortByKey进行排序以创建有序 rdd,并假设您有偶数行(因此每行都有另一行)一个可以计算差异,你可以:

  1. 使用zipWithIndex为每行添加索引。
  2. 通过对创建的索引进行过滤,将RDD拆分为两个RDD,一个具有偶数索引,另一个具有奇数索引。
  3. zip拆分RDD在一起,创建一个Tuple2的新RDD,左边是偶数索引行,右边是奇数索引行。
  4. map计算每行左/右之间差异的结果。

答案 1 :(得分:1)

这可以通过以下方式完成:

  1. 将索引列添加到已排序的rdd
  2. 确保rdd具有偶数行N
  3. 创建一个rdd rdd_even1 以包含索引为[0,N-2]的偶数行
  4. 制作一个rdd rdd_odd1 以包含奇数行[1,N-1]
  5. 制作rdd rdd_even2 以包含偶数行[2,N-2]
  6. 制作rdd rdd_odd2 以包含奇数行[1,N-3]
  7. 现在你需要在压缩之前重新分区 rdd_even1 和* rdd_odd1,因为如果两个rdd在所有分区中都没有相同数量的元素(至少在pyspark中),则压缩将不起作用。您可以使用 collect parallelize 在内存中执行此操作,但很可能您必须将rdd写入HDFS并重新读取它们,控制分区
  8. rdd_even2 rdd_odd2
  9. 执行相同的操作
  10. 将rdd从第7步压缩到 rdd_zip1
  11. 将第8步中的rdd压缩到 rdd_zip2
  12. 致电 rdd_zip1.union(rdd_zip2)
  13. 现在,您可以在联盟上调用 map(),以获得具有所需差异的“结果”
  14. 祝你好运。