Spark Cassandra Connector 3.0.0-如何启用DirectJoin-Java
我有cassandra 3.11.9、spark 3.0.1和spark cassandra连接器3.0.0(依赖项)。我试图使用SCC 3.0.0的直接连接,但似乎当我在下面的数据集上使用连接时,我得到了spark的广播哈希连接Spark Cassandra Connector 3.0.0-如何启用DirectJoin-Java,java,apache-spark,join,cassandra,spark-cassandra-connector,Java,Apache Spark,Join,Cassandra,Spark Cassandra Connector,我有cassandra 3.11.9、spark 3.0.1和spark cassandra连接器3.0.0(依赖项)。我试图使用SCC 3.0.0的直接连接,但似乎当我在下面的数据集上使用连接时,我得到了spark的广播哈希连接 Dataset<Row> metlistinitial = sp.read().format("org.apache.spark.sql.cassandra") .options(new HashMap<S
Dataset<Row> metlistinitial = sp.read().format("org.apache.spark.sql.cassandra")
.options(new HashMap<String, String>() {
{
put("keyspace", "mdb");
put("table", "experiment");
}
})
.load().select(col("experimentid"), col("description"))
.join(dfexplist,"experimentid")
.filter(col("description").notEqual("Unidentified"));
metlistinitial.explain();
== Physical Plan ==
*(1) Project [experimentid#6, description#7]
+- *(1) BroadcastHashJoin [experimentid#6], [experimentid#4], Inner, BuildRight
:- *(1) Project [experimentid#6, description#7]
: +- *(1) Filter NOT (description#7 = Unidentified)
: +- BatchScan[experimentid#6, description#7] Cassandra Scan: mdb.experiment
- Cassandra Filters: []
- Requested Columns: [experimentid,description]
+- BroadcastExchange HashedRelationBroadcastMode(List(input[0, string, true])), [id=#19]
+- LocalTableScan [experimentid#4]
Dataset metlistinitial=sp.read().format(“org.apache.spark.sql.cassandra”)
.options(新的HashMap(){
{
put(“键空间”、“mdb”);
put(“表格”、“实验”);
}
})
.load().select(列(“实验ID”)、列(“说明”))
.join(dfexplist,“实验ID”)
.filter(col(“description”).notEqual(“不明”);
metlistinitial.explain();
==实际计划==
*(1) 项目[实验ID#6,说明#7]
+-*(1)BroadcastHashJoin[experimentid#6],[experimentid#4],内部,BuildRight
:-*(1)项目[实验ID#6,说明#7]
:+-*(1)过滤器不可用(说明#7=未识别)
:+-BatchScan[experimentid#6,description#7]卡桑德拉扫描:mdb.experience
-卡桑德拉过滤器:[]
-请求的列:[实验ID,说明]
+-BroadcastExchange HashedRelationBroadcastMode(列表(输入[0,字符串,true]),[id=#19]
+-LocalTableScan[experimentid#4]
我是否应该启用与cassandra表的直接连接?现在加入大约需要8分钟,我想看看直接加入是否会更快。刚刚找到!似乎我必须通过添加来激活连接器
.config("spark.sql.extensions","com.datastax.spark.connector.CassandraSparkExtensions")
在spark配置中。惊人的表现。现在只需要8秒 你可以在这篇博文中找到更多关于加入的信息:是的,它也帮助了我!不过我刚刚注意到,如果我们想根据分区键获取一些记录,使用DirectJoin非常有效,速度也非常快。但是,如果我们想要获取20亿条记录,并使用分区键列表(即4.800个唯一分区键)直接连接它们,则需要大约15-20分钟,而使用BroadcastHashJoin of spark则需要大约7分钟。您可以调整不同的内容,例如,直接连接停止工作时的比率等等,如果分区键在列表中被指定为
,那么它可能不会自动转换为直接连接。这是一个非常好的消息!不,我没有使用filter.isin(列表),只需加入即可。不过,我想了解更多有关董事会的信息。公式基本上是(表大小*directJoinSizeRatio)>键的大小。所谓表大小是指字节还是行数?同样对于键的大小,是否以字节为单位?有没有计算cassandra表大小(以字节为单位)或键大小的公式?还有,这是否意味着卡桑德拉的紧凑空间?例如,当我在一个节点上输入cfstats时,它显示为8.7716Gb。实际上,我只是把它作为一个新问题添加了进来