2017-02-12 6 views
0

こんにちは、いくつかのルールに基づいてレコードのグループから行をマークしたいと思います。私は私の出力データフレームは、ルールは、2つのcolumns.From IDのグループ(a、b)は、最初のものに基づいて所定のデータフレームでスパークデータフレームの行グループ内の行をマークする方法

id price date 
a 200 2016 
b 100 2016 

あるべき

id price date 
a 100 2016 
a 200 2016 
a 100 2016 
b 100 2016 
b 100 2015 

の下のようなデータフレームを有しています私の実際のルールはより複雑で、多くの他の列も含まれています。

このような問題を解決するには、どのような方法が最適ですか。いくつかのルールに基づいて行のグループから行を選択する必要があります。任意の助けをいただければ幸いです。ありがとう

+0

「行をマークする」という意味を理解しているかどうかはわかりません。他にも何か、これまでに何を試しましたか? – eliasah

+0

@eliasah「行をマークする」とは、行のグループから行をフラグすることを意味します。ここでは2行目(id a)と1行目(id b)です。これについて多くの進歩を遂げていないので、collect_setを使ってすべての値を取得し、ルールを適用しようとしました。ありがとう – John

答えて

2

これを試してください。

val df = Seq(("a",100,2016), ("a",200,2016), ("a",100,2016), ("b",100,2016),("b",100,2015)).toDF("id", "price", "date") 
df.show 
val df1 = df.select($"id", struct($"price", $"date").alias("data")).groupBy($"id").agg(max("data").alias("data")).select($"id", $"data.price", $"data.date") 
df1.show 

以下のような出力が得られます。

+---+-----+----+ 
| id|price|date| 
+---+-----+----+ 
| b| 100|2016| 
| a| 200|2016| 
+---+-----+----+ 
+0

Thanks @abaghel私の実際のルールは、maxgg関数より少し複雑です。私はカスタムルールを指定できる解決策を探しています。提案があれば教えてください。 – John

+0

もう1つの方法は、df.createOrReplaceTempView( "myTable")を使用してDataframeを一時テーブルとして登録し、そのテーブルでSQLクエリを使用することです。 UDFを使用してルール/ロジックを処理することもできます。 – abaghel

関連する問題