Apache spark 展平RDD以使用RDD获得Spark中的非重复值对
考虑一下我在scala中下面的数据框架中的模式Apache spark 展平RDD以使用RDD获得Spark中的非重复值对,apache-spark,Apache Spark,考虑一下我在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])的笛卡尔坐标
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])的笛卡尔坐标
谢谢您可以将其作为
数据帧
保存,然后执行以下操作:
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
您可以将其保留为
数据帧
,然后执行以下操作:
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
顺便说一句,要回答原始问题,您可以像这样展开分组数据:
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))
顺便说一句,要回答原始问题,您可以像这样展开分组数据:
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))
与PySpark API中的
map
结合使用。(假设您使用的是PySpark-这在我看来更像Scala…)是的,我使用的是Scala。scala中是否有一个等价物?老实说,如果不使用groupBy
,并将其作为DataFrame
@KrishnaKalyan,它可能会更容易。scala中的Seq
类(List和其他序列的基类)非常强大,并且包含一个本机。将您的值映射到Seq并获得您的组合。如果拼音
只有一个值怎么办?请与PySpark API中的映射
结合使用。(假设您使用的是PySpark-这在我看来更像Scala…)是的,我使用的是Scala。scala中是否有一个等价物?老实说,如果不使用groupBy
,并将其作为DataFrame
@KrishnaKalyan,它可能会更容易。scala中的Seq
类(List和其他序列的基类)非常强大,并且包含一个本机。将您的值映射到一个Seq并获得您的组合。如果拼音
只有一个值怎么办?