【问题标题】:How do I achieve this in Apache Spark Java or Scala?如何在 Apache Spark Java 或 Scala 中实现这一点?
【发布时间】:2018-08-01 02:14:44
【问题描述】:

汽车上的设备在行程开始时不会发送 TRIP ID,但会在行程结束时发送一个。如何将对应的 TRIP IDS 应用到对应的记录中

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

【问题讨论】:

  • 这种 sql 方法是否有技术术语?像回顾性识别或类似的东西?
  • 至少涉及 JOIN。

标签: apache-spark apache-spark-sql apache-spark-dataset apache-spark-2.0


【解决方案1】:

一个有趣的问题。必须修复一个错误!

当我在 ORACLE 中尝试过时,您需要转换为 spark.sql。但是 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

去掉order by,只用来显示。

此数据作为输入:

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

在我导出并获得此格式时删除引号,返回以下内容,我认为这将满足您的需求 - 再次原谅格式:

 ('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 在引擎盖下的性能如何处理这个问题。这在深夜花费了一些努力,因此寻求一些赞赏。也很有趣。

【讨论】:

  • @blue - 感谢您的努力,我会尝试并更新
  • 它确实有效。您可以使用联接而不是 With
  • JOIN 语法可能需要明确,我倾向于在 IMPALA 和 SPARK ... LEFT JOIN ... 等中使用。
  • @VinodhThiagarajan:你能说明你是怎么做的吗?我将其用作 DF 性能的测试用例。
  • @blue - 我解释了复杂性(这对于我正在工作的域来说是不必要的)n 并修复了数据源的问题。我真的很喜欢你的解决方案,但我没有使用它,因为我的 req 改变了。让我去投票解决方案。
猜你喜欢
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多