如何在查询Cassandra时指示Hive使用分区/主键

时间:2014-04-01 16:56:32

标签: hadoop cassandra hive apache-pig datastax-enterprise

我们正在运行Datastax Enterprise 4.0.1并尝试在Cassandra中针对CF运行不同的M / R作业。我们因此设置了列系列:

CREATE TABLE pageviews (
  website text,
  date text,
  created timestamp,
  browser_id text,
  ip text,
  referer text,
  user_agent text,
  PRIMARY KEY ((website, date), created, browser_id)
) WITH bloom_filter_fp_chance=0.001000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.000000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=1.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='NONE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'min_sstable_size': '52428800', 'class': 'SizeTieredCompactionStrategy'} AND
  compression={'chunk_length_kb': '64', 'sstable_compression': 'LZ4Compressor'};

Hive的好处在于它处理CQL3"展平",以抽象Cassandra的底层列/行存储机制。缺点似乎它不会使用Cassandra的分区密钥或主键来执行快速查找,例如

SELECT COUNT(1) WHERE website = "blah" AND date = "blah";

运行该MR作业似乎执行全表扫描,而不是预先缩小它必须解析的密钥。如果基于分区/主键的过滤有明显的好处,是否可以告诉Hive不执行全表扫描?

旁注:使用Pig时,它似乎可以并且确实使用Cassandra的分区/主键来执行快速查找。 Pig的缺点是我们必须自己完成所有的过滤和压扁 - 这极大地阻碍了创造就业的时间。

1 个答案:

答案 0 :(得分:0)

最好的办法是使用Pig,并使用cql:to CqlStorage(),它可以为您平放Cassandra数据,例如。

grunt> pageviews = LOAD 'cql://ks/pageviews' USING CqlStorage();
grunt> describe pageviews;
grunt> pageviews: {website: chararray,date: chararray,created: long,browser_id: chararray,ip: chararray,referer: chararray,user_agent: chararray}