从Cassandra DB获取特定日期的不同值

时间:2018-03-18 12:21:30

标签: database cassandra nosql distinct cql

我创建了下表

CREATE TABLE IF NOT EXISTS OrderHistory (
  status varchar,
  id bigint,
  ordtype varchar, 
  side varchar, 
  instrument varchar,
  exrate double, 
  dt timestamp, 
  primary key((id,dt),status)
)

用命令填充我的桌子(截图)

我应该执行一个查询来计算某一天的不同ID。例如,它在SQL上:

SELECT COUNT(DISTINCT id) FROM OH.OrderHistory WHERE dt LIKE '%01/10/18%'

我尝试了很多cql但是徒劳无功

看起来应该是

SELECT DISTINCT COUNT(id) FROM oh.orderhistory WHERE dt <= '2018-01-11 00:00:00' and dt >= '2018-01-10 00:00:00' ALLOW FILTERING;

在SQL上但它不起作用

Orders

1 个答案:

答案 0 :(得分:1)

Cassandra并非设计用于此类查询 - 由于其分布式特性,它不支持对任意列进行扫描。如果执行某些查询,则需要围绕此查询建模表(-ies)。例如,在您的示例中(据我所知,它是“查找给定日期的所有订单”),您可以使用 using System; using System.Management; namespace ConsoleApp1 { class Program { static void Main(string[] args) { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_DisplayConfiguration"); string gc = ""; foreach (ManagementObject obj in searcher.Get()) { foreach (PropertyData prop in obj.Properties) { if (prop.Name == "Description") { gc = prop.Value.ToString().ToUpper(); if (gc.Contains("INTEL") == true) { Console.WriteLine("Your Graphic Card is Intel"); } else if (gc.Contains("AMD") == true) { Console.WriteLine("Your Graphic Card is AMD"); } else if (gc.Contains("NVIDIA") == true) { Console.WriteLine("Your Graphic Card is NVIDIA"); } else { Console.WriteLine("Your Graphic Card cannot recognized."); } Console.ReadLine(); } } } } } } 类型而不是date作为分区键(但您需要确保不会有数百万的订单)。

在这种情况下,您可能需要使用Spark,例如,扫描整个数据&amp;执行聚合。