【问题标题】:Having trouble querying by dates using the Java Cassandra Spark SQL Connector使用 Java Cassandra Spark SQL 连接器按日期查询时遇到问题
【发布时间】:2015-05-18 19:26:21
【问题描述】:

我正在尝试使用 Spark SQL 按日期范围查询表。例如,我正在尝试运行如下 SQL 语句:SELECT * FROM trip WHERE utc_startdate >= '2015-01-01' AND utc_startdate

SparkConf sparkConf = new SparkConf().setMaster("local").setAppName("SparkTest")
    .set("spark.executor.memory", "1g")
    .set("spark.cassandra.connection.host", "localhost")
    .set("spark.cassandra.connection.native.port", "9042")
    .set("spark.cassandra.connection.rpc.port", "9160");
JavaSparkContext context = new JavaSparkContext(sparkConf);
JavaCassandraSQLContext sqlContext = new JavaCassandraSQLContext(context);
sqlContext.sqlContext().setKeyspace("mykeyspace");

String sql = "SELECT * FROM trip WHERE utc_startdate >= '2015-01-01' AND utc_startdate < '2015-12-31' AND deployment_id = 1 AND device_id = 1";
JavaSchemaRDD rdd = sqlContext.sql(sql);
List<Row> rows = rdd.collect(); // rows.size() is zero when I would expect it to contain numerous rows.

架构:

CREATE TABLE trip (
    device_id bigint,
    deployment_id bigint,
    utc_startdate timestamp,
    other columns....
    PRIMARY KEY ((device_id, deployment_id), utc_startdate)
) WITH CLUSTERING ORDER BY (utc_startdate ASC);

任何帮助将不胜感激。

【问题讨论】:

    标签: cassandra apache-spark datastax apache-spark-sql


    【解决方案1】:

    您的表架构(特别是您的 PRIMARY KEY 定义)是什么样的?即使没有看到它,我也相当肯定您看到了这种行为,因为您没有使用分区键限定查询。使用ALLOW FILTERING 指令将按date 过滤行(假设这是您的聚类键),但这对于大型集群或大型数据集来说不是一个好的解决方案。

    假设您正在查询某个地理区域的用户。如果你使用 region 作为分区键,你可以运行这个查询,它会工作:

    SELECT * FROM users
    WHERE region='California'
    AND date >= '2015-01-01' AND date <= '2015-12-31';
    

    阅读 Patrick McFadin 在Getting Started with Timeseries Data 上的文章。这有一些很好的例子可以帮助你。

    【讨论】:

    • 谢谢布莱斯。我已经更新了我的问题以包含表架构。包含分区键和日期范围时,我仍然没有收到来自 spark 的结果。如果我从查询中删除日期范围,并仅通过 device_id 和 deployment_id 进行查询,我将收到来自 Spark 的结果。我想知道我是否没有为 Spark SQL 正确编写查询。我已经尝试搜索有关此的一些文档,但没有运气。再次感谢您的帮助。
    • @BrianDiCasa 这很奇怪。阅读您的评论后,我想知道这是否是 SparkSQL 问题。不过,我要说的是,您的分区键(device_iddeployment_id)加在一起可能基数太高,无法按日期范围进行查询。
    • @BrianDiCasa 也在这里找到了一个类似的问题,这可能会有所帮助:stackoverflow.com/questions/27028926/…
    • 我很好奇分区键的基数太高是什么意思?这是否意味着数据将被拆分到太多节点(通过 device_id 和 deployment_id),这会使 utc_startdate 查询效率低下?如果将 deployment_id 声明为 int 而不是 bigint,情况会改善吗?对 Cassandra 来说还很陌生,所以我非常感谢您的帮助!
    • 诚然,我确实在不太了解您的数据模型的情况下发表了该声明。但我的意思是,如果 device_iddeployment_id 只存储一行(因为它们对于每个 CQL 行都是唯一的),那么您将只为每个组合返回一行,这将使 @987654330 @ 或日期范围查询完全没用。但是如果每个device_id/deployment_id 组合都会返回几行,那么这是有道理的。基本上,如果您的分区键太独特(高基数),它会否定“宽行”概念的好处,并且您将没有任何数据要排序。
    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 2016-06-04
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多