Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 展平RDD以使用RDD获得Spark中的非重复值对_Apache Spark - Fatal编程技术网

Apache spark 展平RDD以使用RDD获得Spark中的非重复值对

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])的笛卡尔坐标

考虑一下我在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])的笛卡尔坐标


谢谢

您可以将其作为
数据帧
保存,然后执行以下操作:

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并获得您的组合。如果
拼音
只有一个值怎么办?