2017-09-20 4 views
0

マイデータは次のようになり。scalaを使用してトランザクションで最初のレコードを取得する方法は?</p> <h1><a href="https://i.stack.imgur.com/xWmed.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/xWmed.png" alt="enter image description here"></a></h1> <p>私は発生のミニ時間ですべてのdtcodeの最初のレコードを取得したい:

所望の出力:私は取得したいのScalaを使用することにより

enter image description here

。 ロジックを構築する際に私を案内してください。

ありがとう、 Syam。 Shaidoから正しいコメントで編集

+0

を私はあなたがこの問題を解決することができます参照してください唯一の方法は、手動で全データフレームをループ自身とチェックすることです、下記のジャック・アマールに同意します'dtcode'が変更されたかどうか。それは単にプログラムそのものを行うだけですが、あまり効率的ではありません。それぞれのグループに一意な識別子を与えることができれば、 'groupBy()'は簡単な方法です。 – Shaido

答えて

0

私はあなたの問題についてもう少し考えて、データフレームのWindow機能を使って、より良い解決策を思いつきました。最初にすべてがCurrentdatedtimeで注文され、次に各行がチェックされてdtcodeが変更されているかどうかが確認されます。あなたの例のデータを使用して:

val spark = SparkSession.builder.getOrCreate() 
import spark.implicits._ 


val df = Seq(("7-1-2016 0:00:17",0),("7-1-2016 0:01:17",0), 
    ("7-1-2016 0:02:17",4),("7-1-2016 0:03:17",4), 
    ("7-1-2016 0:04:17",0),("7-1-2016 0:05:17",0), 
    ("7-1-2016 0:06:17",0),("7-1-2016 0:07:17",5)).toDF("Currentdatedtime", "dtcode") 

val w = Window.orderBy("Currentdatedtime") 
val df2 = df.withColumn("dtcode_change", 
    when(lag($"dtcode", 1).over(w) === $"dtcode", 0). 
    otherwise(1)) 
.filter($"dtcode_change" === 1) 
.drop("dtcode_change") 

はあなたを与える:

+----------------+------+ 
|Currentdatedtime|dtcode| 
+----------------+------+ 
|7-1-2016 0:00:17|  0| 
|7-1-2016 0:02:17|  4| 
|7-1-2016 0:04:17|  0| 
|7-1-2016 0:07:17|  5| 
+----------------+------+ 
+0

ありがとうございました... – user3631634

+0

@ user3631634回答を受け入れることを検討してください(回答の横にあるチェックマークをクリックしてください)。 :) – Shaido

0

--- ---通常

、テーブル内の順序は無関係のであればGROUP BYは、これを処理だろう、

SQLは、関連する大量のデータをグループ化すると良いです。ただし、分析はデータ入力の順序に依存し、変更はある列の変更によってトリガーされ、後で繰り返すことができ、集計することはできませんが、他の列は変更を続けることができます。

この場合、SQLにはこの種のものをグループ化する簡単な方法がないため、データをループして手動で変更を検出する必要があります。私は少し早く答え、これに気付かなかった。

これは、STORED PROCEDUREまたは表示言語で処理するのが最適です。あなたが望むなら、私はあなたにPHPでコードを与えることができます。

別のチートは毎回dtcodeを増加させGROUP BY(のはgroubycheatそれを呼びましょう)で使用される列を追加することになります

SELECT MIN(Currentdatedtime) as Currentdatedtime, dtcode 
FROM <tablename> 
GROUP BY groupbycheat; 

を変更するこれはまだフィールドを追加するLOOPが必要ですが、もしあなたは何度も結果を得る必要がある、それはそれの価値がある。そうでなければ..no

+0

'dtcode'はグループごとに一意ではないので、groupByはここでは動作しません。再び与えられた例を確認してください. – Shaido

+0

返信ありがとうございました.. 私はPHPも知らない。 私はPHPを知らない。 このデータはHDFSからフェッチする必要があります。 – user3631634

関連する問題

 関連する問題