运行中的Spark Cassandra连接器:如果Cassandra托管在其他服务器上,该如何工作

时间:2019-07-09 02:40:34

标签: scala apache-spark cassandra spark-cassandra-connector

方案:Cassandra托管在服务器a.b.c.d上,而spark在服务器w.x.y.z上运行。

假设我想从一个表(例如表)casssandra中转换数据,并使用Spark将其重写为cassandra中的另一个表(例如tableNew),我编写的代码看起来像这样

val conf = new SparkConf(true)
        .set("spark.cassandra.connection.host", "a.b.c.d")
        .set("spark.cassandra.auth.username", "<UserName>")            
        .set("spark.cassandra.auth.password", "<Password>")

val spark = SparkSession.builder().master("yarn")
    .config(conf)
    .getOrCreate()

val dfFromCassandra = spark.read.format("org.apache.spark.sql.cassandra").options(Map( "table" -> "<table>", "keyspace" -> "<Keyspace>")).load()

val filteredDF = dfFromCassandra.filter(filterCriteria).write.format("org.apache.spark.sql.cassandra").options(Map( "table" -> "<tableNew>", "keyspace" -> "<Keyspace>")).save

filterCriteria代表我所做的转换/过滤。我不确定在这种情况下内部的Spark cassandra连接器如何工作。 这是我的困惑:

1:是否将spark从Cassandra源表中加载数据到内存,然后对其进行过滤并将其重新加载到Target表中,或者

2:Spark cassandra连接器是否将过滤条件转换为Where子句,并且仅加载相关数据以形成RDD并将其写回到Cassandra Or中的目标表中?

3:整个操作是否像cql操作一样发生,将查询转换为类似sql的查询并在cassandra本身中执行?(我几乎可以确定这不会发生)

1 个答案:

答案 0 :(得分:2)

根据您的destinationViewController. tableView(destinationViewController.tableView, didSelectRowAt: IndexPath(row: 0, section: 0)) 是1还是2。自然,Spark本身不能执行任何CQL筛选,但是自定义数据源可以使用谓词下推来实现它。如果是Cassandra驱动程序,则实现为here,答案取决于是否覆盖了所使用的filterCriteria