我有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函数只获取选定的数据。
这是最佳做法吗?