2016-05-19 15 views
0

My DataFrame dfには、多対1のテーブルへの外部キーとして機能する列がdfとなっています。外部キーの一意の各値について、それは別の外部キーが含まれていますが、一度だけ、そのグループが空の状態の値を超えるすべてで:ここでPySpark DataFrame reduce_by

df.filter(df.foreignkey1 == "12345").select("foreignkey1", "foreignkey2").show() 

+-----------+-----------+ 
|foreignkey1|foreignkey2| 
+-----------+-----------+ 
|  12345|   | 
|  12345|   | 
|  12345|   | 
|  12345| 100002020| 
|  12345|   | 
+-----------+-----------+ 

、私はforeignkey1が12345であるすべてのエントリを選択している、とその隣にforeignkey2という値が表示されました。私はこれまで、このダウン崩壊したい

:理論的には

+-----------+-----------+ 
|foreignkey1|foreignkey2| 
+-----------+-----------+ 
|  12345| 100002020| 
+-----------+-----------+ 

これの一部はそれをテストしているが、唯一、foreignkey1のユニークな値ごとに1 foreignkey2があるはずです。

私はSparkにとってかなり新しく、これは他の人に尋ねるのに適しているように思えます。どんな助けでも大歓迎です。私の最善の選択肢はdf.rdd.reduceByKeyですか、それともgroupby関数と集約関数を使ってこれを行うにはもっと知的な方法がありますか?ありがとう!

+0

だけ考えた:私は可能性がおそらくちょうど 'dropna()'とそれは長くにおけるユニークな値の数よりもだかどうかを確認'foreignkey1'です。しかし、それは 'foreignkey1 'に1つの' foreignkey2'があることを保証するものではありませんが、おそらくそれを強く示します。 – Quentin

答えて

1

私は、これはトリックを行うことができると思う:

df.groupBy("fk").agg(max("fk2")) 

それは2つだけの列が返されます:fkmax(fk2)を。 2番目の列は、fkの各値に対してfk2の最大値を示します。

しかし、このアプローチはあまり効率的ではありません。より多くがあることができれば、そうでない場合

df.select("fk", "fk2").filter(col("fk2").isNotNull()) 

:あなたはfkの各値についてfk2で唯一の価値があると確信している、あなたが他の列を必要としないのであれば、その代わりに、多分あなたは次の操作を行うことができますfkにつき1 fk2よりも、あなたはパフォーマンスを改善する試みとして、両方のアプローチをマージしようとすることができます

df.select("fk", "fk2").filter(col("fk2").isNotNull()).groupBy("fk").agg(max("fk2")) 
+0

ダニエルの仮定が正しいとすれば、効率の観点からは第2のアプローチがはるかに優れている – David

+0

ありがとう、良い解決策。私のFK間に1対1のマップがあるかどうかを調べるために、2番目のスニペットが役に立つでしょう。実行した後、このDFの行数とfk1の一意の値の数を比較できます。 – Quentin

関連する問題