我想在由5个不良系统组成的集群上使用Apache Spark。首先,我在节点上实现了cassandra 3.11.3,并且所有节点都正常。
此后,我在不使用Spark的情况下使用JAVA api在节点中插入了10万条记录,一切都OK。
现在,我想执行一个简单的查询,如下所示:
select * from myKeySpace.myTbl where field1='someValue';
由于我的节点硬件薄弱,所以我想从myTbl那里获取一些记录,如下所示:
select * from myKeySpace.myTbl where field1='someValue' limit 20;
我已经测试了这个(A),但是它非常慢(我不知道原因):
Dataset<Row> df1 = sparkSession.sql("select * from myKeySpace.myTbl where field1='someValue' limit 20");
还有(B)我认为Spark会获取所有数据,然后使用限制功能,这不是我的目标:
Dataset<Row> df1 = sparkSession.sql("select * from myKeySpace.myTbl where field1='someValue'").limit(20);
我想我也可以使用Spark核心(C)。我也知道在cassandra 3.6及更高版本(D)中实现了一种名为perPartitionLimit
的方法。
您知道,由于我的节点很弱,所以我不想从cassandra表中获取所有记录,然后再使用limit函数或类似的方法。我只想从表中获取少量记录,以便我的节点可以处理这些记录。
那么最好的解决方案是什么?
更新:
我已经完成了@AKSW在评论中给出的建议:
SparkConf conf = new SparkConf()
.setAppName("SparkTest")
.set("spark.cassandra.connection.host","192.168.107.100");
long limit=20;
JavaSparkContext jsc = new JavaSparkContext(conf);
CassandraJavaRDD<CassandraRow> rdd1 = javaFunctions(jsc)
.cassandraTable("myKeySpace", "myTbl")
.select("id").perPartitionLimit(limit);
System.out.println("Count: " + rdd1.count()); //output is "Count: 100000" which is wrong!
jsc.stop();
但perPartitionLimit(limit)
认为limit=20
不起作用,并且所有记录都已提取!