Cassndra/Spark关联数据点分离的百万记录



我有传感器数据和近似格式显示了我在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数据点在逻辑中导出一些信息的事实。我正在考虑使用火花为相同的。相关性纯粹基于SensorEventType,是查找SET9和SET1之间持续时间的业务逻辑需求。因此,如果SET9发生在SET1之后,那么记录发生之间的时间间隔,并将其保存在另一个表中。

现在的问题是为了关联Spark中的数据,似乎我需要实际加载所有的数据点,所有的百万在内存中SET1和SET9之间的关联。这是解决设计问题的正确方法吗?

任何人都有更好的指针应该如何设计,以及如何在数百万数据点之间的spark中的相关性将工作。我是新的火花,任何帮助将在理解感激。

我不确定我完全理解你的用例,但似乎你不需要使用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类型。

最新更新