1
6
快速回答
对但使用SparkSQL时,只需要对列进行修剪和谓词下推。在RDDs中,它是手动的。
由于您的请求返回得足够快,因此我将直接使用Java驱动程序来获取此结果集。 冗长的答案虽然Spark SQL可以提供一些基于C*的优化,但在使用DataFrame接口时,这些优化通常仅限于谓词下推。这是因为框架只向数据源提供有限的信息。我们可以通过执行 解释 在您编写的查询上。 让我们从SparkSQL示例开始
因此,您的Spark示例实际上将分为几个步骤。
为什么这一切都不能降到C*?这是因为 Datasource (本例中为CassandraSourceRelation)未提供 不同的 查询的一部分。这只是Spark目前工作方式的一部分。 Docs on what is pushable 那么RDD版本呢?使用RDD,我们可以直接为Spark提供一组指令。这意味着如果你想把东西推下去 manually specified .让我们看看RDD请求的调试输出
这里的问题是,您的“distinct”调用是对 RDD 也不是卡桑德拉特有的。由于RDD要求所有优化都是显式的(您键入的就是您得到的),Cassandra从来没有听说过对“Distinct”的需求,我们得到的计划几乎与我们的Spark SQL版本相同。进行完整扫描,将所有数据从Cassandra序列化到Spark。执行随机播放,然后返回结果。 那么我们能做些什么呢?使用SparkSQL,在不向 Catalyst (SparkSQL/Dataframes优化器),让它知道Cassandra可以处理一些 不同的 在服务器级别调用。然后需要为CassandraRDD子类实现它。
对于RDD,我们需要添加一个类似于现有函数的函数
在不修改底层连接器的情况下,我们现在可以做什么?由于我们知道要发出的确切CQL请求,因此始终可以直接使用Cassandra驱动程序来获取此信息。Spark Cassandra连接器提供了一个我们可以使用的驱动程序池,或者我们可以直接使用Java驱动程序。要使用游泳池,我们可以
然后,如果需要进一步的Spark工作,则将结果并行化。如果我们真的想发布它,那么很可能需要像我上面描述的那样将该功能添加到Spark Cassandra连接器中。 |
2
2
只要选择分区键,就可以使用
这是因为 SPARKC-436
给出的结果与
|
3
0
Distinct的性能很差。 这里有一个很好的答案,有一些备选方案: How to efficiently select distinct rows on an RDD based on a subset of its columns` 您可以利用toDebugString来了解代码洗牌了多少数据。 |