我使用PySpark和数据帧与cassandra-connector面临以下问题 . 我的Cassandra数据湖包含跨(网络)设备的度量测量,条目类型(设备,接口,度量,时间,值) .

我的原始数据的cassandra表有:

PRIMARY KEY ((device,interface,metric),time)

因为可以有效地获取给定测量的时间范围 .

现在出于报告目的,用户可以查询任何设备/接口/度量组合(即为设备的所有接口提供特定度量) . 现在我知道每个列表,所以我不打算做通配符搜索,而是查询IN查询 .

我正在使用Spark 1.4,所以我添加过滤器,比如获取数据帧以计算记录的度量值上的最小值/最大值/百分位数等 .

metrics_raw_sub = metrics_raw\
                    .filter(metrics_raw.device.inSet (device_list))\
                    .filter(metrics_raw.interface.inSet (interface_list))\
                    .filter(metrics_raw.metric.inSet (metric_list))

这不是非常有效,因为这些谓词不会被推送到CQL(只有最后一个谓词可以是IN查询),所以我在客户端提取大量数据和过滤 . (不好)

为什么cassandra-connector不允许跨分区列的多个IN谓词?在本机CQL shell中执行此操作似乎有效吗?

上面我的问题的另一种方法是(并且当谓词被推送到Cassandra时,这会产生有效的单个查询):

for device in device_list:
    for interface in interface_list:
        metrics_raw_sub = metrics_raw\
                .filter(metrics_raw.device == device)\
                .filter(metrics_raw.interface == interface)\
                .filter(metrics_raw.metric.inSet (metric_list))

然后为每个子查询运行聚合逻辑,但我觉得这主要是序列化所有请求的设备/接口/度量值的并行计算...我可以批量处理Cassandra查询,以便我可以在一个上运行我的分析大型分布式数据帧?

最重要的是,我希望能够非常有效地完成这项工作 . 如果周转时间足够短,我们将按需运行这些 . 如果没有,我们需要考虑预先计算它们并存储到表格中(这会牺牲自定义时间范围报告的灵活性)

任何见解将非常感谢!!聂 .