【问题标题】:flatten an RDD to get non repeating value pair in Spark using RDD使用 RDD 展平 RDD 以在 Spark 中获取非重复值对
【发布时间】:2016-03-30 11:02:54
【问题描述】:

考虑一下我在 scala 中下面数据框中的架构。

root
  |-- phonetic: string (nullable = true)
  |-- sigID: long (nullable = true)

我基本上是按音标分组的。

featuers.rdd.groupBy(x => x.apply(0))

下面会给我一个rdd

(abc,([1],[2],[3]))
(def,([9],[8]))

如何将其展平以获得 (key,([value-a,value-b])) 的笛卡尔坐标

abc,1,2
abc,1,3
abc,2,3
def,9,8
....

谢谢

【问题讨论】:

  • itertools.combinations 与来自 PySpark API 的 map 结合使用。 (假设您使用的是 PySpark - 这在我看来更像 Scala...)
  • 是的,我正在使用 scala。 scala中是否有等价物?
  • 老实说,如果不使用groupBy 并将其保留为DataFrame 可能会更容易
  • @KrishnaKalyan Scala 中的Seq 类(List 和其他序列的基类)非常强大,包括一个原生的combinations。将您的值映射到 Seq 并获取您的组合。
  • 如果phonetic 只有一个值怎么办?

标签: apache-spark


【解决方案1】:

您可以将其保留为 DataFrame 并执行以下操作:

val df: DataFrame = ...

df.as("df1").join(
  df.as("df2"),
  ($"df2.phonetic" === $"df1.phonetic") && ($"df1.sigID" !== $"df2.sigID")
).select($"df1.phonetic", $"df1.sigID", $"df2.sigID").show

【讨论】:

    【解决方案2】:

    顺便说一句,要回答原始问题,您可以像这样展开分组数据:

    df.rdd.groupBy(x => x.apply(0)).flatMap(t => {
      val longs = t._2.toArray.map(r => r.getLong(1));
      longs.flatMap(l => longs.flatMap(l2 => {
        if (l != l2) Seq((t._1, l, l2));
        else Seq() 
      }))
    }).collect
    
    res35: Array[(Any, Long, Long)] = Array((def,9,8), (def,8,9), (abc,1,2), (abc,1,3), (abc,2,1), (abc,2,3), (abc,3,1), (abc,3,2))
    

    【讨论】:

      猜你喜欢
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多