2017-09-20 115 views
0

我的數據是這樣的:如何使用scala獲取事務中的第一條記錄?

enter image description here

我希望獲取與出現的小時間每dtcode的第一條記錄。

所需的輸出:

enter image description here

通過使用Scala的,我想取。 請指導我構建邏輯。

謝謝, Syam。

+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

---從Shaido正確的評論EDITED ---

通常,GROUP BY會解決這個問題,如果在表中的順序是無關緊要,

SQL好與分組大量相關數據。但是,您的分析取決於數據輸入的順序,並且更改由一列中的更改觸發,可以稍後重複並且不能彙總,而其他列可以繼續更改。

在這種情況下,您需要對數據進行LOOP並手動檢測更改,因爲SQL沒有簡單的方法來對這類事件進行分組。我回答得有點太快,並沒有注意到這一點。

這最好通過存儲過程或顯示語言來處理。如果你願意,我可以在PHP中給你代碼。

另一個騙子會增加所使用GROUP BY列(姑且稱之爲groubycheat)被增加每次dtcode改變

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

這仍然需要一個循環加場,但如果你需要多次獲得結果,那就值得。否則..沒有

+0

groupBy在這裏不起作用,因爲'dtcode'對每個組都不是唯一的。檢查再次給出的例子,有兩個組0. – Shaido

+0

感謝您的回覆shaido .. 我既不想SQL或斯卡拉 我不知道PHP。 這些數據需要從HDFS中獲取。 – user3631634

相關問題