首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >星火DataFrame和卡桑德拉

星火DataFrame和卡桑德拉
EN

Stack Overflow用户
提问于 2016-09-21 11:18:50
回答 1查看 921关注 0票数 2

我们一直在使用Spark (Spark2.0)来处理在Cassandra.Note中建模的数据,这些数据是在Cassandra中建模的,以实现高效的读写。

不过,现在也有Spark,即Spark,它也是另一种数据访问方法-- DataFrame http://spark.apache.org/docs/latest/sql-programming-guide.html

使用Spark,我们使用CQL使用Datastax驱动程序API访问Cassandra http://docs.datastax.com/en/developer/java-driver/2.0/,类似于

代码语言:javascript
运行
复制
val resultSets = new util.ArrayList[Row]()
val resultSet = CassandraConnector(SparkReader.conf).withSessionDo[ResultSet] { session =>
     val sel_stmt = QueryBuilder.select("yyy", "zz", "xxxx")
                .from("geokpi_keyspace", table_name)
                .where(QueryBuilder.eq("bin", bin))
                .and(QueryBuilder.eq("year", year))
                .and(QueryBuilder.eq("month", month))
                .and(QueryBuilder.eq("day", day))
                .and(QueryBuilder.eq("cell", cell))

    session.execute(sel_stmt)

    }
resultSets.addAll(resultSet.all())
})
resultSets.asScala.toList --> RDD[Row]

因为我们几乎直接使用CQL,所以它不允许您做一些不被Cassandra支持的事情,比如JOINS,因为Cassandra设计不支持它。但是,使用Spark或Spark访问DataFrame数据库的替代方法,将为您提供一个abstraction.For类型的底层关系数据库--这将是很好的。

但是,使用这种抽象,比如连接来查询存储在NoSQL数据库中的数据,比如Cassandra,似乎是一个错误的abstraction.Working,因为它不知道数据模型(分区键、聚类键等),这对于数据的高效读写非常重要,难道它不会导致从底层Cassandra节点生成高效的代码和高效/缓慢的数据检索吗?

EN

回答 1

Stack Overflow用户

发布于 2016-09-21 13:20:55

我将争辩说,您关于我们在使用Spark时忽略数据模型的假设是不正确的,它实践了我们在非常严格的契约下工作,在默认情况下,数据源可能只处理基本的预测和选择,而繁重的处理则由Spark集群执行。

同时,数据源开发人员在设计给定连接器时可以自由地包含任何类型的域或系统特定知识。JDBC数据源就是一个很好的例子,例如,您可以查看我对How to partition Spark RDD when importing Postgres using JDBC?的回答,看看如何使用它来执行一些非标准操作。

尽管Cassandra连接器在这里似乎有点有限(如果我错了,我还没有广泛使用它),但它的RDD组件提供了广泛的Cassandra感知操作,可用于执行服务器端操作和优化整个工作流。

无论是哪一种方式,当星火试图迫使外部系统执行不受支持的操作时,并不存在这种情况。

它不会导致高效生成的代码和低效率/慢数据检索吗?

我们在此必须提出的基本问题是,这有什么关系?通过使用给定的资源进行分析工作的事实,我们隐含地接受了这样一个事实,即我们可能以一种不典型于其日常操作使用的方式来强调给定的系统。

同时,如果我们使用的系统不支持数据处理管道中所需的某些操作,那么我们应该承认,执行这些操作的成本可能大大高于优化的系统。虽然低效率的处理成本很高,但在选择技术栈和设计基础设施时,应该考虑到这一点。

最后,如果某些操作具有不可接受的性能影响(是的,联接是昂贵的),那么它应该反映在数据建模中。

由于我们几乎直接使用CQL,所以它不允许您做一些不受Cassandra支持的事情,比如联接,因为Cassandra的设计不支持它。

如前所述,Spark也是如此。直接获取数据和稍后执行连接不会改变执行模型中的任何内容。

忽略了这个特殊示例中没有任何东西是DataFrame API无法处理的,并且可以使用cassandraTable执行更复杂的检索。

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

https://stackoverflow.com/questions/39615095

复制
相关文章

相似问题

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