2016-03-30 7 views
0

以下のデータフレームで使用しているスキーマをscalaで検討してください。RDDを使用してSparkでRDDを平滑化して、反復値のペアを取得しない

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

私は基本的に音声でグループ分けしています。私が(キー、([値が-、値-B]))

abc,1,2 
abc,1,3 
abc,2,3 
def,9,8 
.... 
のデカルトを取得するには、これを平らにするにはどうすればよい

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

以下RDDを与える

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

おかげ

+0

使用[itertools.combinations](https://docs.python.org/2/library/ itertools.html#itertools.combinations)をPySpark APIの 'map'と組み合わせて使用​​します。 (あなたがPySparkを使用していると仮定すると、これは私にとってScalaに似ています...) –

+0

はい私はscalaを使用しています。スカラーに相当するものはありますか? –

+0

正直言って、 'groupBy'を実行せずに' DataFrame'として保存する方が簡単かもしれません。 –

答えて

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 
1

ちなみに、元の質問に答えるために、あなたはこのようにグループ化されたデータを楽しみながらおくつろぎいただけます。

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)) 
関連する問題