![]() |
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来了解代码洗牌了多少数据。 |
![]() |
User1414 · 基于不同字段值在R中创建子集数据集 7 年前 |
![]() |
ChiMo · 在Spark中选择独特的Cassandra 7 年前 |
![]() |
malasi · 删除两对重复的大小写[重复] 7 年前 |
![]() |
Calflamesfann · 如何为每个不同的代码值选择不同的项目 7 年前 |
![]() |
Alex · 选择每周不同和每周不同总体 7 年前 |
![]() |
QA_Col · 将查询从Postgres传递到JPA 7 年前 |