发布
社区首页 >问答首页 >为什么在写入新的卡桑德拉表之前和之后,星火DataFrames中有不同数量的元素?

为什么在写入新的卡桑德拉表之前和之后,星火DataFrames中有不同数量的元素?
EN

Stack Overflow用户
提问于 2018-01-17 21:03:21
回答 1查看 190关注 0票数 2

在我的代码中,我将一个现有的Cassandra表中的数据读取到一个火花DataFrame中,并将其转换为构建一组具有原始数据反向映射的新表(最终目标是为通过REST提供的搜索查询提供服务)。

最近,我添加了一些追踪,发现了一件我无法解释的事情。下面是一段Scala代码来说明这个问题。

代码语言:javascript
代码运行次数:0
复制
// df: org.apache.spark.sql.DataFrame
//
// control point 1: before writing the data to Cassandra
val inputCount = df.count
// write data to new C* table
df.createCassandraTable(keyspaceName, tableName, <otherArgs>)
df.write.mode("append").cassandraFormat(tableName, keyspaceName).save()

// read data back
val readbackDf = sqlContext.read.cassandraFormat(tableName, keyspaceName).load().cache
// control point 2: data written to C* table
val outputCount = readbackDf.count

// Produces different numbers
println(s"Input count = ${inputCount}; output count = ${outputCount}")

如果在将数据写入新创建的表之前计算数据的.count,它与从这个新表中读取数据所得到的数据的.count不同。

因此,我有两个问题:

  1. 为什么我要观察inputCountoutputCount的不同值?
  2. 如果我在上面的代码中使用了错误的方法来计算outputCount,那么正确的方法是什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-31 10:44:22

这个问题确实与Cassandra的一致性设置有关。非常感谢Anurag指出这一点。

结果发现,在我的测试环境中,我使用默认的读写策略,即LOCAL_ONE。所以这很容易解释这种分歧。

最后,我把它们都设置为LOCAL_QUORUM

代码语言:javascript
代码运行次数:0
复制
spark.cassandra.input.consistency.level=LOCAL_QUORUM
spark.cassandra.output.consistency.level=LOCAL_QUORUM

说了这些之后,我想指出,我也尝试过只设置对LOCAL_QUORUM的读取

代码语言:javascript
代码运行次数:0
复制
spark.cassandra.input.consistency.level=LOCAL_QUORUM
spark.cassandra.output.consistency.level=LOCAL_ONE

这几乎抵消了分歧。

至今,我仍然能够观察到(有时是中的1/ 3-4 )与我的一些ETL作业之间的细微差异。

虽然我没有看到将读/写一致性设置为LOCAL_QUORUM会显著降低性能,因此问题不会再阻止我,但我仍然很好奇,为什么只将读设置为LOCAL_QUORUM并不能完全解决问题。

有人能对此提出“假人”的解释吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48309935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档