如何将列表拆分为多个分区并发送给执行者

时间:2019-02-04 19:25:18

标签: scala apache-spark cassandra

当我们按照以下方式使用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加载数据而无需扫描整个表?

1 个答案:

答案 0 :(得分:0)

您只需要使用joinWithCassandra function来执行操作所需的仅数据选择。但是请注意,此功能仅可通过RDD API使用。

类似这样的东西:

val joinWithRDD = your_df.rdd.joinWithCassandraTable("tab","events")

您需要确保DataFrame中的列名与Cassandra中的分区键名匹配-有关更多信息,请参见文档。

DataFrame实现仅在following blog post中所述的DSE版本的Spark Cassandra Connector中可用。