在使用Pyspark / Dataframes时,如何将谓词下推到Cassandra或限制请求的数据?

时间:2016-12-06 04:06:09

标签: apache-spark cassandra pyspark

例如我们在docs.datastax.com提到:

table1 = sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="kv", keyspace="ks").load()

它是我所知道的唯一方式,但是我想说我只想从这个表中加载最后一百万个条目。我不想每次都在内存中加载整个表,特别是如果这个表有超过1000万个条目。

谢谢!

1 个答案:

答案 0 :(得分:3)

虽然您无法更快地加载数据。您可以加载部分数据或提前终止。 Spark DataFrames利用催化剂来优化它的底层查询计划,使其能够采取一些捷径。

例如,调用limit将允许Spark跳过从基础DataSource读取一些部分。这些将通过取消执行任务来限制从Cassandra读取的数据量。

底层数据源可以使用调用过滤器或添加过滤器来帮助限制从Cassandra实际提取的信息量。可以推送的内容有一些限制,但这些都在文档中详细说明。

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/14_data_frames.md#pushing-down-clauses-to-cassandra

注意所有这一切都是通过在调用DataSource后对其进行进一步的api调用来完成的。例如

val df = sqlContext
  .read
  .format("org.apache.spark.sql.cassandra")
  .options(table="kv", keyspace="ks")
  .load()

df.show(10) // Will compute only enough tasks to get 10 records and no more
df.filter(clusteringKey > 5).show() //Will pass down the clustering predicate to C*