Apache spark 如何在Apache Spark Java或Scala中实现这一点?

Apache spark 如何在Apache Spark Java或Scala中实现这一点?,apache-spark,apache-spark-sql,apache-spark-dataset,apache-spark-2.0,Apache Spark,Apache Spark Sql,Apache Spark Dataset,Apache Spark 2.0,汽车上的设备不会在行程开始时发送行程ID,但会在行程结束时发送。如何将相应的行程ID应用于相应的记录 09:30,25,DEVICE_1 10:30,55,DEVICE_1 10:25,0,DEVICE_1,TRIP_ID_0 11:30,45,DEVICE_1 10:30,55,DEVICE_2 10:30,55,DEVICE_3 11:30,45,DEVICE_3 12:30,0,DEVICE_3,TRIP_ID_3 10:30,55,DEVICE_4 11:30,45,DEVICE_4 1

汽车上的设备不会在行程开始时发送行程ID,但会在行程结束时发送。如何将相应的行程ID应用于相应的记录

09:30,25,DEVICE_1
10:30,55,DEVICE_1
10:25,0,DEVICE_1,TRIP_ID_0
11:30,45,DEVICE_1
10:30,55,DEVICE_2
10:30,55,DEVICE_3
11:30,45,DEVICE_3
12:30,0,DEVICE_3,TRIP_ID_3
10:30,55,DEVICE_4
11:30,45,DEVICE_4
11:30,45,DEVICE_2
12:30,0,DEVICE_2,TRIP_ID_2
12:30,0,DEVICE_4,TRIP_ID_4
10:30,55,DEVICE_5
11:30,45,DEVICE_5
12:30,0,DEVICE_5,TRIP_ID_5
12:30,0,DEVICE_1,TRIP_ID_1
所以上面变成这样,

09:30,25,DEVICE_1,TRIP_ID_0
10:25,0,DEVICE_1,TRIP_ID_0
10:30,55,DEVICE_1,TRIP_ID_1
11:30,45,DEVICE_1,TRIP_ID_1
12:30,0,DEVICE_1,TRIP_ID_1
10:30,55,DEVICE_2,TRIP_ID_2
11:30,45,DEVICE_2,TRIP_ID_2
12:30,0,DEVICE_2,TRIP_ID_2
10:30,55,DEVICE_3,TRIP_ID_3
11:30,45,DEVICE_3,TRIP_ID_3
12:30,0,DEVICE_3,TRIP_ID_3
10:30,55,DEVICE_4,TRIP_ID_4
11:30,45,DEVICE_4,TRIP_ID_4
12:30,0,DEVICE_4,TRIP_ID_4
10:30,55,DEVICE_5,TRIP_ID_5
11:30,45,DEVICE_5,TRIP_ID_5
12:30,0,DEVICE_5,TRIP_ID_5

一个有趣的问题。必须修复一个bug

您需要转换为spark.sql,因为我在ORACLE中尝试了这一点。但是spark.sql中支持WITH子句。另外,由于时间已经很晚了,我没有使用日期字符串,而是使用数字来表示时间,所以您需要了解一下

但这里是您可以适应的SQL

with X as (select device, time_asc, trip_id from trips where trip_id is not null)
select Y.TRIP_ID, Y.DEVICE, Y.TIME_ASC FROM (
select T1.TIME_ASC, T1.DEVICE, X.TRIP_ID, X.TIME_ASC AS TIME_ASC_COMPARE
      ,RANK() OVER (PARTITION BY T1.TIME_ASC, T1.DEVICE ORDER BY X.TIME_ASC) AS RANK_VAL       from trips T1, X
 where T1.DEVICE = X.DEVICE
   and T1.TIME_ASC <= X.TIME_ASC) Y
 where RANK_VAL = 1
 order by TRIP_ID, TIME_ASC
在我导出并获得此格式时删除引号,返回以下内容,我认为这些内容将满足您的需要-再次请原谅格式化:

 ('TRIP_01','A','1');
 ('TRIP_01','A','2');
 ('TRIP_02','A','5');
 ('TRIP_02','A','6');
 ('TRIP_02','A','7');
 ('TRIP_02','A','23');
 ('TRIP_03','B','8');
 ('TRIP_03','B','10');
 ('TRIP_04','A','56');
 ('TRIP_04','A','60');
 ('TRIP_05','E','1');
 ('TRIP_05','E','2');

我想知道SPARK在引擎盖下的性能如何处理这个问题。这需要在深夜进行一些努力,因此需要一些欣赏。也很有趣。

这种sql方法有没有专门的术语?像回顾id或类似的东西?至少需要加入。@blue-谢谢你的努力,我会尝试一下并更新它。您可以使用连接而不是WithJOIN语法可能需要明确,我倾向于在IMPALA和SPARK中使用。。。左连接。。。等等@VinodhThiagarajan:你能说说你是怎么做的吗?我将它用作DFs性能的测试用例。@blue-我解释了复杂性(这对于我正在工作的域是不必要的)n并修复了数据源的w.r.t问题。我真的很喜欢你的解决方案,但我没有使用它作为我的要求改变。让我投票表决解决方案。
 ('TRIP_01','A','1');
 ('TRIP_01','A','2');
 ('TRIP_02','A','5');
 ('TRIP_02','A','6');
 ('TRIP_02','A','7');
 ('TRIP_02','A','23');
 ('TRIP_03','B','8');
 ('TRIP_03','B','10');
 ('TRIP_04','A','56');
 ('TRIP_04','A','60');
 ('TRIP_05','E','1');
 ('TRIP_05','E','2');