从 Cassandra 中仅提取 Spark 中所需的列而不加载所有列

Pulling only required columns in Spark from Cassandra without loading all the columns

使用 spark-elasticsearch 连接器可以直接从 ES 只加载需要的列到 Spark。但是,似乎不存在使用 spark-cassandra 连接器

来执行相同操作的直接选项

从ES读取数据到Spark -- 这里只有必需的列从 ES 带到 Spark :

spark.conf.set('es.nodes', ",".join(ES_CLUSTER))
es_epf_df = spark.read.format("org.elasticsearch.spark.sql") \
        .option("es.read.field.include", "id_,employee_name") \
        .load("employee_0001") \

正在将数据从 Cassandra 读取到 Spark -- 这里所有列的数据都被激发,然后应用 select 来提取感兴趣的列:

spark.conf.set('spark.cassandra.connection.host', ','.join(CASSANDRA_CLUSTER))
cass_epf_df = spark.read.format('org.apache.spark.sql.cassandra') \
        .options(keyspace="db_0001", table="employee") \
        .load() \
        .select("id_", "employee_name")

是否可以为 Cassandra 做同样的事情?如果是,那么如何。如果不是,那为什么不。

实际上,connector 应该自己做,不需要显式设置任何东西,它被称为 "predicate pushdown",根据文档,cassandra-connector 会做:

The connector will automatically pushdown all valid predicates to Cassandra. The Datasource will also automatically only select columns from Cassandra which are required to complete the query. This can be monitored with the explain command.

来源:https://github.com/datastax/spark-cassandra-connector/blob/master/doc/14_data_frames.md

您编写的代码已经在这样做了。您在加载后写了 select,您可能认为首先提取所有列,然后过滤 selected 列,但事实并非如此。

假设:select * from db_0001.employee;

实际:select id_, employee_name from db_0001.employee;

Spark 将了解您需要的列并仅查询 Cassandra 数据库中的列。此功能称为谓词下推。这不仅限于 cassandra,许多资源都支持此功能(这是 spark 的功能,而不是 casssandra)。

更多信息:https://docs.datastax.com/en/dse/6.7/dse-dev/datastax_enterprise/spark/sparkPredicatePushdown.html