优雅的迭代方式在Spark DataFrame中进行比较

时间:2018-03-25 01:30:29

标签: apache-spark

我有一个包含2列的Spark DataFrame:C1:Seq[Any]C2:Double。我想

  1. C1
  2. 的长度排序
  3. 对于c1中的每个元素C1,请与C1中长度超过c1的所有其他元素进行比较。

    2.1如果c1包含在另一个元素cx中,则将c2c2x进行比较。

    2.2如果c2> c2x,然后过滤掉(c1x, c2x)

  4. 有没有一种优雅的方法来实现这一目标?

    示例输入:

    C1 C2
    ab 1.0
    abc 0.5
    

    预期产出:

    C1 C2
    ab 1.0
    

    包含=子集。例如ab包含在abc中。

1 个答案:

答案 0 :(得分:-1)

  
    

我有一个包含2列的Spark DataFrame:C1:Seq [Any]和C2:Double

  
val rdd = sc.parallelize(List(("ab", 1.0), ("abc", 0.5)))
  
    
        
  1. C1
  2. 的长度排序        
val rddSorted = rdd.sortBy(_._1.length).collect().distinct
  
    
        
  1. 对于c1中的每个元素C1,请与C1中长于c1的所有其他元素进行比较。
        2.1如果c1包含在另一个元素cx中,则将c2c2x进行比较。
        2.2如果c2> c2x,然后过滤掉(c1x, c2x)
  2.        
val result = for(
        (x, y) <- rddSorted;
        (a, b) <- rddSorted.dropWhile{case(c,d) => c == x && d == y};
        if(a.contains(x) && a.length > x.length && y > b)
      )yield (x, y)

多数民众赞成。你应该得到你想要的东西