如何在Cassandra中使用GROUP BY?

7vhp5slm  于 2023-08-04  发布在  Cassandra
关注(0)|答案(2)|浏览(243)

我有一个数据集

("group_1" , uuid , other, columns),
("group_1" , uuid , other, columns),
("group_1" , uuid , other, columns),
("group_2" , uuid , other, columns),
("group_2" , uuid , other, columns),
("group_3" , uuid , other, columns),
("group_3" , uuid , other, columns),

字符串
它位于一个表中,声明如下:

CREATE TABLE sample(
 group TEXT,
 id TEXT,
 Other,
 columns,
 PRIMARY KEY( group , id)
);


我想做的是获取一个数据列表,所有具有相同组名的数据将在同一行中。我的意思是

[ 
 [("group_1" , uuid , other, columns),
  ("group_1" , uuid , other, columns),
  ("group_1" , uuid , other, columns)],
 [("group_2" , uuid , other, columns),
  ("group_2" , uuid , other, columns)],
 [("group_3" , uuid , other, columns),
  ("group_3" , uuid , other, columns)],
]


这是具有相同组名的行的列表。
我不知道是否可以使用数据库内置函数(如GROUP BY)来获得这样的结果,因为当我尝试它时,它只返回以下查询中相同组名行的第一行:

SELECT * FROM sample GROUP BY group;


我也很想知道是否有更好的方法来达到这个结果?
PS:为什么我不使用组键来获取像SELECT * FROM sample WHERE group = 'group_1';这样的数据是因为我不知道组名(有数千个),我只想获取一堆具有不同组名的数据,并将它们放在相同的组名中,并使用相同的组名创建一个列表。

7rtdyuoh

7rtdyuoh1#

Cassandra并不是设计用来使用SELECT选择大量数据的。在WHERE子句中定义分区键是非常重要的,它可以从特定的节点中进行选择,而集群键可以进一步限制所选的行数。

4nkexdtk

4nkexdtk2#

GROUP BY子句将列值汇总到组中。
为了说明,让我们考虑这个车辆数据集:

Brand  | Model         | Body type
--------+---------------+-----------
 Kia    | Sportage      | SUV
 Kia    | Sorento       | SUV
 Kia    | Seltos        | SUV
 Kia    | Stonic        | SUV
 Kia    | Niro          | EV
 Kia    | EV6           | EV
 Kia    | EV9           | EV
 Kia    | Cerato        | Car
 Kia    | Picanto       | Car
 Toyota | Yaris         | Car
 Toyota | Corolla       | Car
 Toyota | Camry         | Car
 Toyota | Yaris Cross   | SUV
 Toyota | C-HR          | SUV
 Toyota | Corolla Cross | SUV
 Toyota | RAV4          | SUV
 Toyota | Kluger        | SUV
 Toyota | Fortuner      | SUV
 Toyota | Prado         | SUV
 Toyota | Landcruiser   | SUV

字符串
在此表中,我们存储按体型聚类的品牌数据:

CREATE TABLE vehicles_by_brand_body_type (
    brand text,
    body_type text,
    model text,
    PRIMARY KEY (brand, body_type, model)
)


下面是如何使用GROUP BY子句获取起亚销售的车身类型列表的示例:

cqlsh> SELECT body_type FROM vehicles_by_brand_body_type
           WHERE brand = 'Kia'
           GROUP BY body_type;

 body_type
-----------
       Car
        EV
       SUV


但在您的例子中,问题并不在于对数据进行分组,而在于您没有按分区键查询数据。执行无界查询(没有WHERE子句或过滤器)的开销很大,因为它需要全表扫描。它可能在非生产环境中工作,或者当您有一个小集群时,但它不能扩展,因此不建议在生产环境中使用。
您需要正确地对数据进行建模,以便将它们分组/集群到一个分区中,并通过分区键从集群请求数据。干杯!

相关问题