我有传感器数据,约格式显示我将其存储在cassandra表中的方式。
CREATE TABLE sensor_log (
sensor_id BIGINT,
created_at TIMEUUID,
SensorEventType TEXT,
PRIMARY KEY(sensor_id, created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC)
发生了10种不同类型的事件(SensorEventType)。说它们被命名为
(SensorEventType)SET1...SET10.
我保留了90天的数据。
其中一些类型的事件发生得非常频繁,而且有些非常罕见。
所以发生的事情是SET1发生在第1天发生,SET9发生在第60天之后。在此之间还有许多记录的其他SensorEventType记录。因此,介于两者之间将有1亿个数据点。
example
SENSOR_ID Data stored Clustered by created_at.
1 SET2,SET1,SET3,SET4....100millionrandomSET....SET9,SET3,SET4....
2 SET4,SET5,SET1,SET4....100millionrandomSET....SET2,SET9,SET6....
each SET stored in sequential manner by created_at
我需要为每个传感器关联SET1和SET9数据指向逻辑以获取某些信息的事实。我正在考虑使用火花。 Correlation完全基于SensorEventType,是查找SET9和SET1之间的持续时间的业务逻辑要求。因此,如果SET9发生在SET1之后,则记下发生之间的持续时间并将其保存在另一个表中。
现在的问题是为了关联Spark中的数据,似乎我需要实际加载所有数据点,其中所有数据点都在内存中,以便在SET1和SET9之间进行关联。这是考虑解决这个设计问题的正确方法吗?
任何一个人都有更好的指针指向如何设计它以及数据点之间的数百万的火花相关性如何起作用。我是新来的火花,任何帮助都会在理解中受到赞赏。
答案 0 :(得分:1)
我不确定我是否完全理解您的用例,但似乎您可能不需要使用Spark并且可以在简单的Cassandra中进行此关联。
代替(或可能除了)表记录单个分区中传感器的所有事件,为什么不将事件类型添加到分区键中,如下所示:
CREATE TABLE sensor_log (
sensor_id BIGINT,
created_at TIMEUUID,
SensorEventType TEXT,
PRIMARY KEY((sensor_id, SensorEventType), created_at)
)
WITH CLUSTERING ORDER BY (created_at DESC)
这会将每个SET值放在您自己的分区中,以便您可以独立查询每个传感器。
通过这样做,SET1和SET9事件之间的1亿个数据点将放在单独的分区中,并且不会妨碍您。因此,当SET9事件进入时,只需从该传感器的SET1分区中选择最新的数据点:
SELECT created_at FROM sensor_log WHERE sensor_id=x and SensorEventType=SET1 LIMIT 1;
现在从传入的SET9事件的created_at时间中减去created_at时间。
这样的分区也可以简化Spark的使用,因为你可以从这些较小的分区创建RDD,只加载SET1和SET9分区而不是所有的SET类型。