Spark Cassandra多分区RDD

时间:2015-08-26 11:26:28

标签: java cassandra apache-spark datastax

我有cassandra事件表,如:

CREATE TABLE EVENT (
    eventType ascii,
    day ascii,
    ......
    PRIMARY KEY ((eventType, day), ...)
);

' 20150824',' 20150825'

等日子

我想创建具有多个分区的RDD(多个day)。根据我的读数,我不得不在Spark 1.2上进行自定义分区(缺少IN支持)并执行:

JavaRDD<CassandraRow> unionTable = null;
for (String day : days) {
    if (unionTable == null) {
        unionTable = javaFunctions(sparkContext).cassandraTable("event_keyspace", "event")//
                .select("columns_to_select")//
                .where("eventType='" + eventType + "' and day = '" + day + "'");
    } else {
        unionTable = unionTable.union(javaFunctions(sparkContext).cassandraTable("event_keyspace", "event")//
                .select("columns_to_select")//
                .where("eventType='" + eventType + "' and day = '" + day + "'");
    }
}

// do job on union table

现在我想使用Spark 1.4,但是上面的代码我得到了强制转换异常。 UnionRDD无法投放到CassandraTableScanRDD

我看到1.4支持IN查询,但当我这样做时,它的性能非常糟糕(1个任务):

unionTable = javaFunctions(sparkContext).cassandraTable("event_keyspace", "event")//
                .select("columns_to_select")//
                .where("eventType='" + eventType + "' and day IN('" + StringUtils.join(days, "', '") + "')";

使用Java API实现此目的的最佳实践是什么?那么joinWithCassandraTable呢?我不想将所有数据都带到Spark并进行过滤。我看到一些例子,但它们大多不适用于java API。

我的新Java API代码如下:

List<PartitionKey> rows = new ArrayList<>();
rows.add(new PartitionKey()); // PartitionKey contains eventType and day 
CassandraJavaPairRDD<PartitionKey, SelectedData> pairRDD = javaFunctions(sparkContext.parallelize(rows))//
        .joinWithCassandraTable("event_keyspace", "event",
            CassandraJavaUtil.someColumns(..SelectedData instance variables..), //
            CassandraJavaUtil.someColumns("eventType", "day"), //
            CassandraJavaUtil.mapRowTo(SelectedData.class), CassandraJavaUtil.mapToRow(PartitionKey.class));//

我调用map函数只获取选定的数据。

这是最佳做法吗?

0 个答案:

没有答案