当我们按照以下方式使用spark从csv for DB中读取数据时,它将自动将数据拆分到多个分区并发送给执行者
spark
.read
.option("delimiter", ",")
.option("header", "true")
.option("mergeSchema", "true")
.option("codec", properties.getProperty("sparkCodeC"))
.format(properties.getProperty("fileFormat"))
.load(inputFile)
当前,我有一个ID列表:
[1,2,3,4,5,6,7,8,9,...1000]
我想做的就是将此列表拆分为多个分区,并发送给执行者,在每个执行者中,以sql身份运行
ids.foreach(id => {
select * from table where id = id
})
当我们从cassandra加载数据时,连接器将生成查询sql:
select columns from table where Token(k) >= ? and Token(k) <= ?
这意味着连接器将扫描整个数据库,实际上,我不需要扫描整个表,我只是从ID表中的k(分区键)表中获取所有数据的方式。 / p>
表架构为:
CREATE TABLE IF NOT EXISTS tab.events (
k int,
o text,
event text
PRIMARY KEY (k,o)
);
或者我如何使用Spark通过预定义的sql语句从cassandra加载数据而无需扫描整个表?
答案 0 :(得分:0)
您只需要使用joinWithCassandra
function来执行操作所需的仅数据选择。但是请注意,此功能仅可通过RDD API使用。
类似这样的东西:
val joinWithRDD = your_df.rdd.joinWithCassandraTable("tab","events")
您需要确保DataFrame中的列名与Cassandra中的分区键名匹配-有关更多信息,请参见文档。
DataFrame实现仅在following blog post中所述的DSE版本的Spark Cassandra Connector中可用。