2017-09-20 71 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

相关问题