2017-09-22 9 views
1

現在の入力行に基づいて集計関数によって使用されるウィンドウ枠内の行を制約します。例えば、データフレームdfとウィンドウwを与え、私のような何かをできるようにしたい:.filterは、フレームの入力行に基づいて、現在のウィンドウ・フレームから行を削除します[Py] Spark SQL:フレームの入力行を使用してウィンドウの各フレームを制約します。

df2 = df.withColumn("foo", first(col("bar").filter(...)).over(w)) 

。次のように

私の具体的な使用例は次のとおりです。あなたは、各入力の最初の行(fr)を見つけるだろうかDATAFRAME df

+-----+--+--+ 
|group|n1|n2| 
+-----+--+--+ 
| 1| 1| 6| 
| 1| 0| 3| 
| 1| 2| 2| 
| 1| 3| 5| 
| 2| 0| 5| 
| 2| 0| 7| 
| 2| 3| 2| 
| 2| 5| 9| 
+-----+--+--+ 

ウィンドウ

w = Window.partitionBy("group")\ 
      .orderBy("n1", "n2")\ 
      .rowsBetween(Window.currentRow + 1, Window.unboundedFollowing) 

といくつかの正のロングi、考えます行rのフレームr.n1 < fr.n1r.n2 < fr.n2、max(fr.n1-r.n1,fr.n2-r.n2)< i?返される値はfr.n1またはfrの行インデックスdfになります。だから、私はスパークAPIを勉強してWindowfirst、およびwhenの例で見てきた

+-----+--+--+-----+ 
|group|n1|n2|fr.n1| 
+-----+--+--+-----+ 
| 1| 1| 6| null| 
| 1| 0| 3| 1| 
| 1| 2| 2| 3| 
| 1| 3| 5| null| 
| 2| 0| 5| 5| 
| 2| 0| 7| 5| 
| 2| 3| 2| null| 
| 2| 5| 9| null| 
+-----+--+--+-----+ 

i = 6のために、たとえばdfのための出力は以下のようになりますが、私は片に見えることはできません一緒に。これはWindowや集約関数でも可能ですか?それとも私は完全にマークから外れていますか?あなただけのウィンドウ関数と集計でそれを行うことができなくなります

+1

ここで問題を本当にやりたかったことを私にはっきりと説明できませんか? '' | ''ならば –

+0

2 | 3 | 2 | 5 | 'が真の場合、どうすれば' | 1 | 2 | 2 | 3 | 'は本当ですか?およびその逆。彼らはお互いに矛盾する。あなたの最終的なdfを見直してください。 –

+0

おっと!元のサンプルソリューションを正しいものに更新しました。うまくいけば、もっと明確にするために、冒頭の一般的な説明に例を追加しました。 – alan

答えて

1

、あなたは自分が必要となります参加:参加の場合 :

df = sc.parallelize([[1, 1, 6],[1, 0, 3],[1, 2, 2],[1, 3, 5],[2, 0, 5],[2, 0, 7],[2, 3, 2],[2, 5, 9]]).toDF(["group","n1","n2"]) 

import pyspark.sql.functions as psf 
df_r = df.select([df[c].alias("r_" + c) for c in df.columns]) 
df_join = df_r\ 
    .join(df, (df_r.r_group == df.group) 
     & (df_r.r_n1 < df.n1) 
     & (df_r.r_n2 < df.n2) 
     & (psf.greatest(df.n1 - df_r.r_n1, df.n2 - df_r.r_n2) < i), "leftouter")\ 
    .drop("group") 

を今、我々は唯一の窓関数を適用することができます

w = Window.partitionBy("r_group", "r_n1", "r_n2").orderBy("n1", "n2") 
res = df_join\ 
    .withColumn("rn", psf.row_number().over(w))\ 
    .filter("rn = 1").drop("rn") 

    +-------+----+----+----+----+ 
    |r_group|r_n1|r_n2| n1| n2| 
    +-------+----+----+----+----+ 
    |  1| 0| 3| 1| 6| 
    |  1| 1| 6|null|null| 
    |  1| 2| 2| 3| 5| 
    |  1| 3| 5|null|null| 
    |  2| 0| 5| 5| 9| 
    |  2| 0| 7| 5| 9| 
    |  2| 3| 2|null|null| 
    |  2| 5| 9|null|null| 
    +-------+----+----+----+----+ 
+0

答えをありがとう。少なくとも私の特定のケースでは、それが効果的にウィンドウ枠が何をしているのかということから、それは結合を必要とすることは意味があります。 – alan

関連する問題