使用连接器,可以直接将所需列从ES加载到Spark。然而,使用火花-卡桑德拉连接器,似乎不存在这样一个直接向前的选项来进行同样的操作。
将ES中的数据读入火花--这里只有必需的列被从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") \把卡桑德拉的数据读入星火--在这里,所有列的数据都会被激发,然后选择被应用于拉出感兴趣的列:
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")卡桑德拉也能这么做吗?如果是的话那该怎么做。如果没有,那为什么不呢?
发布于 2020-06-18 20:17:20
实际上,连接器本身就应该这样做,而不需要显式设置任何东西,根据文档,它被称为“谓词下推”,而cassandra-连接器就是这样做的:
连接器将自动将所有有效谓词推到Cassandra。Datasource还将自动只从Cassandra中选择完成查询所需的列。可以使用explain命令对此进行监视。
来源:https://github.com/datastax/spark-cassandra-connector/blob/master/doc/14_data_frames.md
发布于 2020-06-19 02:21:27
您编写的代码已经在这样做了。您已经在加载后编写了select,您可能认为首先所有的列都被拉出,然后选定的列被过滤,但事实并非如此。
假设:select * from db_0001.employee;
实际:select id_, employee_name from db_0001.employee;
Spark将理解您需要的列,并且只查询Cassandra数据库中的列。这个特性称为谓词下推。这不仅限于卡桑德拉,许多来源都支持这一特性(这是火花的一个特征,而不是木薯)。
欲了解更多信息:https://docs.datastax.com/en/dse/6.7/dse-dev/datastax_enterprise/spark/sparkPredicatePushdown.html
https://stackoverflow.com/questions/62457616
复制相似问题