Cassandra Spark连接器

时间:2016-08-03 11:53:42

标签: apache-spark cassandra-2.0 datastax-enterprise datastax-java-driver spark-cassandra-connector

我的cassandra CF将日期和ID作为分区键。 在查询时我只知道日期,所以我循环了id的范围。

我的问题围绕连接器如何执行以下代码。

SparkDriver代码看起来像 -

SparkConf conf = new SparkConf().setAppName("DemoApp")
.conf.setMaster("local[*]")
.set("spark.cassandra.connection.host", "10.*.*.*")
.set("spark.cassandra.connection.port", "*");

JavaSparkContext sc = new JavaSparkContext(conf);
SparkContextJavaFunctions javaFunctions = CassandraJavaUtil.javaFunctions(sc);

String date = "23012017";

for(String id : idlist) {

JavaRDD<CassandraRow> cassandraRowsRDD = 

javaFunctions.cassandraTable("datakeyspace", "sample2")
            .where("date = ?",date)
            .where("id = ? ", id)
            .select("data");

 cassandraRowsRDDList.add(cassandraRowsRDD);
}

List<CassandraRow> collectAllRows = new ArrayList<CassandraRow>();
        for(JavaRDD<CassandraRow> rdd : cassandraRowsRDDList){
            //do transformations

            collectAllRows.addAll(rdd.collect());
    }

1)首先我想询问是否循环idlist,说idlist有1000个元素可能会增加,这会有效吗?每个选择查询如何在集群中分发?特别是如何维护Cassandra数据库连接?

2)在我的驱动程序中循环结束后,我将所有行放在List中,然后将转换应用于每一行并过滤掉重复项。这也会通过集群上的火花来分配,还是会发生在司机旁边。

请帮忙。

1 个答案:

答案 0 :(得分:0)

有一种更好的方法可以通过spark cassandra连接器提供此功能。 你可以创建一个(date,id)的rdd,然后在列date和id上调用joinWithCassandraTable函数。连接器巧妙地执行所有数据将仅由工作人员提取,而且没有随机播放,每个工作人员只会获取日期和ID所拥有的数据。