Scala 数据帧写入速度比在spark中保存到cassandra的RDD慢10倍
我尝试将cassandra save表与RDD和DataSet的30000条记录进行比较。我发现数据集保存比RDD慢10倍。 该表有4个分区键Scala 数据帧写入速度比在spark中保存到cassandra的RDD慢10倍,scala,apache-spark,spark-dataframe,spark-cassandra-connector,Scala,Apache Spark,Spark Dataframe,Spark Cassandra Connector,我尝试将cassandra save表与RDD和DataSet的30000条记录进行比较。我发现数据集保存比RDD慢10倍。 该表有4个分区键 DSE Version :5.1.7 Spark version :2.0.1 Nodes:6( 20 cores each 6g) Using Spark Standalone 我们使用了以下spark配置: spark.scheduler.listenerbus.eventqueue.size=100000 spark.locality.w
DSE Version :5.1.7
Spark version :2.0.1
Nodes:6( 20 cores each 6g)
Using Spark Standalone
我们使用了以下spark配置:
val sparkSession = SparkSession.builder().config(conf).getOrCreate()
import sparkSession.implicits._
val RDD1 = sc.cassandraTable[TableName]("keySpace1", "TableName")
.where("id =?,id)
RDD1.saveToCassandra("keySpace1", "TableName")
var DS1 = sparkSession.read
.format("org.apache.spark.sql.cassandra")
.options(Map("table" -> "TableName", "keyspace" ->"keySpace1"))
.load()
.where("id ='"+ id +"'").as[CaseClassModel]
DS1.write.format("org.apache.spark.sql.cassandra")
.mode(SaveMode.Append).option("table", "TableName1")
.option("keyspace", "KeySpace1")
.save()
由于Dataframe和RDD方法都使用相同的底层存储代码,因此不太可能看到如此巨大的差异,除非转换为DF类型的开销非常高。在我们自己对数十亿行的测试中,我们只看到速度上的几个百分点的差异
虽然30k记录是一个非常小的数量,任何数量的开销都可能变得相关,但我认为最有可能的原因是where子句中的查找在RDD和DF代码中被不同的解释。我会检查以确保它被正确地推送到DF代码中(有关DF加载,请参见
解释)由于Dataframe和RDD方法都使用相同的底层保存代码,因此不太可能看到如此巨大的差异,除非转换为DF类型的开销非常高。在我们自己对数十亿行的测试中,我们只看到速度上的几个百分点的差异
虽然30k记录是一个非常小的数量,任何数量的开销都可能变得相关,但我认为最有可能的原因是where子句中的查找在RDD和DF代码中被不同的解释。我会检查以确保它被正确地推送到DF代码中(有关DF加载,请参见解释)我们实际上对Rdd和dataset使用了完全相同的where子句,即使这样,我们也会得到相同的差异。我试图让您知道,DF实现中的where子句实际上是不同的。即使它有字面上相同的文本。Dataframes将谓词转换为DF类,并检查类型是否正确匹配。如果他们不这样做,它可能会退回到执行完全扫描,而不是谓词下推。这就是为什么我说您应该运行explain命令来查看DF代码中到底发生了什么。实际上,我们对Rdd和dataset使用了完全相同的where子句,即使这样,我们也得到了相同的差异。我试图让您知道,DF实现中的where子句实际上是不同的。即使它有字面上相同的文本。Dataframes将谓词转换为DF类,并检查类型是否正确匹配。如果他们不这样做,它可能会退回到执行完全扫描,而不是谓词下推。这就是为什么我说您应该运行explain命令来查看DF代码中到底发生了什么。