2016-03-07 51 views
1

我是Spark的新手,希望在与Cassandra合作时了解更多关于它的操作。PySpark上的spark-cassandra的服务器端过滤

我已被提醒在大多数教程中做服务器端过滤,我完全理解这样做的重要性。

然而那些教程或者基于Scala或者pyspark_cassandra,并且他们都没有使用PySpark。

只是好奇,如果下面的scriptlet是做服务器端过滤或不。

给定一个SparkConf对象conf

sc = pyspark.SparkContext(conf=conf) 

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

df.filter("id = 1234").show() 

另外,我有没有加载整个表到我的火花集群做过滤在这种情况下?

回答

1

Cassandra连接器支持Spark DataFrames上的谓词下推,只要启用下推,就可以安全地假定基本过滤器在Cassandra端执行。它可能不适用于复杂的谓词。如果您有疑问,最好检查BasicCassandraPredicatePushDown docstrings

您也可以查看执行计划(explain)。如果预测被下推应该在PushedFilters部分中列出,例如:

df = (sqlContext 
    .read 
    .format("org.apache.spark.sql.cassandra") 
    .options(table="words", keyspace="test") 
    .load()) 

df.select("word").where(col("word") == "bar").explain() 
## == Physical Plan == 
## Scan [email protected][word#0] 
## ... PushedFilters: [EqualTo(word,bar)] 

在星火1.6 PushedFilters解释是有点误导。它将列出数据源已显示的所有过滤器,但实际上不会告诉您数据源使用哪些过滤器。在这种情况下,最好只查看计划是否有针对谓词的单独筛选步骤。如果它确实比连接器没有下推谓词。如果没有,那么谓词就会被推。

另一个选项是打开信息/调试日志记录星火卡桑德拉连接器,看看到底是什么连接器是使用催化剂

+1

做我只是想指出,在星火1.6,该PushedFilters解释是误导性的。它会列出数据源可以看到的所有过滤器,但实际上并不会告诉你哪些过滤器实际被推送。在这种情况下,最好只看看spark是否在数据源之外单独执行了“Filter”步骤。如果没有,那么谓词就会被推。您还可以打开连接器的INFO/DEBUG日志记录以准确查看连接器在Catalyst中执行的操作。 – RussS