如何在 Pig 中过滤 Cassandra TimeUUID/UUID

Posted

技术标签:

【中文标题】如何在 Pig 中过滤 Cassandra TimeUUID/UUID【英文标题】:How to FILTER Cassandra TimeUUID/UUID in Pig 【发布时间】:2014-03-03 23:23:58 【问题描述】:

这是我的 Cassandra 架构,使用 Datastax Enterprise

CREATE KEYSPACE applications
  WITH replication = 'class': 'SimpleStrategy', 'replication_factor' : 1;

USE applications;

CREATE TABLE events(
  bucket text, 
  id timeuuid,
  app_id uuid,  
  event text, 
  PRIMARY KEY(bucket, id)
);

我想通过app_id (TimeUUID) 和id (UUID) 在 PIG 中过滤,这是我的 Pig 脚本。

events = LOAD 'cql://applications/events'
  USING CqlStorage()
  AS (bucket: chararray, id: chararray, app_id: chararray, event: chararray);

result = FOREACH events GENERATE bucket, id, app_id;
DESCRIBE result;
DUMP result;

这是结果

result: bucket: chararray,id: chararray,app_id: chararray
(2014-02-28-04,?O]??4??p??M?,;??F? (|?Mb) \n
(2014-02-28-04,?O??4??p??M?,?h^@?E????)
(2014-02-28-04,?V???4??p??M?,;??F? (|?Mb)
(2014-02-28-04,?W?0?4??p??M?,?h^@?E????)
(2014-02-28-04,?X^p?4??p??M?,?h^@?E????)

注意,app_idid 字段是二进制的,我需要按一些 UUID 进行过滤,有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要使用 UDF 将 UUID/TimeUUID 的二进制字节转换为 chararray。不要尝试像AS那样直接定义为chararray (bucket: chararray, id: chararray, app_id: chararray, event: chararray);

或者您可以使用 https://github.com/cevaris/pig-dse/blob/master/src/main/java/com/dse/pig/udfs/AbstractCassandraStorage.java 将 UUID/TimeUUID 转换为字符串

如果您认为将 UUID 转换为默认字符串比较好,请提交 Cassandra 票证。

【讨论】:

是的,你是对的。我遇到的下一个问题是如何尝试将转换后的 String UUID/TimeUUID 存储回 UUID/TimeUUID 类型。因为我在 Cassandra 中使用 CQL3,所以有一个类型检查,它不喜欢 UUID/TimeUUID 的 chararray 版本。我假设我必须解析每个 chararray 以查看它是否是 UUID/TimeUUID 并在存储之前将其转换回来。我只是在 Pig 中放弃了 UUID 比较,然后继续前进。【参考方案2】:

能够使用自定义版本的 CQLStorage UDF Pig Loader 解决问题。问题是 Cassandras CQLStorage/CassandraStorage Pig 加载器不知道如何处理 UUID/TimeUUID 类型。我假设大多数非标准数据类型都会发生这种情况。无论如何,这里是 github 上编码解决方案的链接。

https://github.com/cevaris/pig-dse

【讨论】:

以上是关于如何在 Pig 中过滤 Cassandra TimeUUID/UUID的主要内容,如果未能解决你的问题,请参考以下文章

带有 cassandra 的命令行

在 Pig 中生成 Cassandra 友好关系

Pig into Cassandra - 使用 python UDF 和 CqlStorage 传递列表对象

cassandra + pig 宽柱

将 PIG 与 cassandra 一起使用的限制

使用 pig 将小数导入 cassandra