自定义Cassandra数据类型

在博客文章《 从Java连接到Cassandra》中 ,我提到了用Java 实现的Cassandra Java开发人员的一个优势是能够创建自定义 Cassandra数据类型 。 在这篇文章中,我将详细介绍如何执行此操作。

Cassandra具有许多内置的数据类型 ,但是在某些情况下,可能需要添加自定义类型。 通过扩展org.apache.cassandra.db.marshal.AbstractType类,可以在Java中实现Cassandra定制数据类型。 扩展此方法的类必须最终实现具有以下签名的三个方法:

public ByteBuffer fromString(final String) throws MarshalException
public TypeSerializer getSerializer()
public int compare(Object, Object)

下一个代码清单中显示了本文的AbstractType示例实现。

UnitedStatesState.java –扩展AbstractType

package dustin.examples.cassandra.cqltypes;import org.apache.cassandra.db.marshal.AbstractType;
import org.apache.cassandra.serializers.MarshalException;
import org.apache.cassandra.serializers.TypeSerializer;import java.nio.ByteBuffer;/*** Representation of a state in the United States that* can be persisted to Cassandra database.*/
public class UnitedStatesState extends AbstractType
{public static final UnitedStatesState instance = new UnitedStatesState();@Overridepublic ByteBuffer fromString(final String stateName) throws MarshalException{return getStateAbbreviationAsByteBuffer(stateName);}@Overridepublic TypeSerializer getSerializer(){return UnitedStatesStateSerializer.instance;}@Overridepublic int compare(Object o1, Object o2){if (o1 == null && o2 == null){return 0;}else if (o1 == null){return 1;}else if (o2 == null){return -1;}else{return o1.toString().compareTo(o2.toString());}}/*** Provide standard two-letter abbreviation for United States* state whose state name is provided.** @param stateName Name of state whose abbreviation is desired.* @return State's abbreviation as a ByteBuffer; will return "UK"*    if provided state name is unexpected value.*/private ByteBuffer getStateAbbreviationAsByteBuffer(final String stateName){final String upperCaseStateName = stateName != null ? stateName.toUpperCase().replace(" ", "_") : "UNKNOWN";String abbreviation;try{abbreviation =  upperCaseStateName.length() == 2? State.fromAbbreviation(upperCaseStateName).getStateAbbreviation(): State.valueOf(upperCaseStateName).getStateAbbreviation();}catch (Exception exception){abbreviation = State.UNKNOWN.getStateAbbreviation();}return ByteBuffer.wrap(abbreviation.getBytes());}
}

上面的类列表引用了State枚举,如下所示。

State.java

package dustin.examples.cassandra.cqltypes;/*** Representation of state in the United States.*/
public enum State
{ALABAMA("Alabama", "AL"),ALASKA("Alaska", "AK"),ARIZONA("Arizona", "AZ"),ARKANSAS("Arkansas", "AR"),CALIFORNIA("California", "CA"),COLORADO("Colorado", "CO"),CONNECTICUT("Connecticut", "CT"),DELAWARE("Delaware", "DE"),DISTRICT_OF_COLUMBIA("District of Columbia", "DC"),FLORIDA("Florida", "FL"),GEORGIA("Georgia", "GA"),HAWAII("Hawaii", "HI"),IDAHO("Idaho", "ID"),ILLINOIS("Illinois", "IL"),INDIANA("Indiana", "IN"),IOWA("Iowa", "IA"),KANSAS("Kansas", "KS"),LOUISIANA("Louisiana", "LA"),MAINE("Maine", "ME"),MARYLAND("Maryland", "MD"),MASSACHUSETTS("Massachusetts", "MA"),MICHIGAN("Michigan", "MI"),MINNESOTA("Minnesota", "MN"),MISSISSIPPI("Mississippi", "MS"),MISSOURI("Missouri", "MO"),MONTANA("Montana", "MT"),NEBRASKA("Nebraska", "NE"),NEVADA("Nevada", "NV"),NEW_HAMPSHIRE("New Hampshire", "NH"),NEW_JERSEY("New Jersey", "NJ"),NEW_MEXICO("New Mexico", "NM"),NORTH_CAROLINA("North Carolina", "NC"),NORTH_DAKOTA("North Dakota", "ND"),NEW_YORK("New York", "NY"),OHIO("Ohio", "OH"),OKLAHOMA("Oklahoma", "OK"),OREGON("Oregon", "OR"),PENNSYLVANIA("Pennsylvania", "PA"),RHODE_ISLAND("Rhode Island", "RI"),SOUTH_CAROLINA("South Carolina", "SC"),SOUTH_DAKOTA("South Dakota", "SD"),TENNESSEE("Tennessee", "TN"),TEXAS("Texas", "TX"),UTAH("Utah", "UT"),VERMONT("Vermont", "VT"),VIRGINIA("Virginia", "VA"),WASHINGTON("Washington", "WA"),WEST_VIRGINIA("West Virginia", "WV"),WISCONSIN("Wisconsin", "WI"),WYOMING("Wyoming", "WY"),UNKNOWN("Unknown", "UK");private String stateName;private String stateAbbreviation;State(final String newStateName, final String newStateAbbreviation){this.stateName = newStateName;this.stateAbbreviation = newStateAbbreviation;}public String getStateName(){return this.stateName;}public String getStateAbbreviation(){return this.stateAbbreviation;}public static State fromAbbreviation(final String candidateAbbreviation){State match = UNKNOWN;if (candidateAbbreviation != null && candidateAbbreviation.length() == 2){final String upperAbbreviation = candidateAbbreviation.toUpperCase();for (final State state : State.values()){if (state.stateAbbreviation.equals(upperAbbreviation)){match = state;}}}return match;}
}

我们还可以提供上面显示的getSerializer()方法返回的TypeSerializer接口的实现。 通常,通过扩展org.apache.cassandra.serializers package中Cassandra提供的TypeSerializer的众多现有实现之一,通常可以最容易地编写实现TypeSerializer类。 在我的示例中,我的自定义序列化程序扩展了AbstractTextSerializer ,我需要添加的唯一方法是签名public void validate(final ByteBuffer bytes) throws MarshalException 。 我的两个自定义类都需要通过静态访问提供对自身实例的引用。 这是通过AbstractTypeSerializer扩展实现TypeSerializer的类:

UnitedStatesStateSerializer.java –实现TypeSerializer

package dustin.examples.cassandra.cqltypes;import org.apache.cassandra.serializers.AbstractTextSerializer;
import org.apache.cassandra.serializers.MarshalException;import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;/*** Serializer for UnitedStatesState.*/
public class UnitedStatesStateSerializer extends AbstractTextSerializer
{public static final UnitedStatesStateSerializer instance = new UnitedStatesStateSerializer();private UnitedStatesStateSerializer(){super(StandardCharsets.UTF_8);}/*** Validates provided ByteBuffer contents to ensure they can* be modeled in the UnitedStatesState Cassandra/CQL data type.* This allows for a full state name to be specified or for its* two-digit abbreviation to be specified and either is considered* valid.** @param bytes ByteBuffer whose contents are to be validated.* @throws MarshalException Thrown if provided data is invalid.*/@Overridepublic void validate(final ByteBuffer bytes) throws MarshalException{try{final String stringFormat = new String(bytes.array()).toUpperCase();final State state =  stringFormat.length() == 2? State.fromAbbreviation(stringFormat): State.valueOf(stringFormat);}catch (Exception exception){throw new MarshalException("Invalid model cannot be marshaled as UnitedStatesState.");}}
}

编写了用于创建自定义CQL数据类型的类后,需要将它们编译为.class文件并存档在JAR文件中。 此过程(使用javac -cp "C:\Program Files\DataStax Community\apache-cassandra\lib\*" -sourcepath src -d classes src\dustin\examples\cassandra\cqltypes\*.java ,并将生成的归档.class下面的屏幕快照中显示了将.class文件转换为名为jar cvf CustomCqlTypes.jar *名为CustomCqlTypes.jar的JAR。

compilingCustomTypesClasses

带有自定义CQL类型类的类定义的JAR需要放置在Cassandra安装的lib目录中,如下一个屏幕快照所示。

movingCqlCustomTypesJarToCassandraLibDir

通过在Cassandra安装目录的lib目录中包含自定义CQL数据类型类实现的JAR,应该重新启动Cassandra,以便它能够“看到”这些自定义数据类型定义。

下一个代码清单显示了一个Cassandra查询语言(CQL)语句,该语句用于使用新的自定义类型dustin.examples.cassandra.cqltypes.UnitedStatesState创建表。

createAddress.cql

CREATE TABLE us_address
(id uuid,street1 text,street2 text,city text,state 'dustin.examples.cassandra.cqltypes.UnitedStatesState',zipcode text,PRIMARY KEY(id)
);

下一个屏幕快照通过描述cqlsh中创建的表来演示运行上述createAddress.cql代码的结果。

descUSAddressWithCustomType

上面的屏幕快照演示了自定义类型dustin.examples.cassandra.cqltypes.UnitedStatesStateus_address表的state列的类型。

可以使用常规INSERT将新行添加到US_ADDRESS表中。 例如,以下屏幕快照演示了使用INSERT INTO us_address (id, street1, street2, city, state, zipcode) VALUES (blobAsUuid(timeuuidAsBlob(now())), '350 Fifth Avenue', '', 'New York', 'New York', '10118');命令INSERT INTO us_address (id, street1, street2, city, state, zipcode) VALUES (blobAsUuid(timeuuidAsBlob(now())), '350 Fifth Avenue', '', 'New York', 'New York', '10118');

insertingAddressWithCustomStateTypeIntoCassandraDB

请注意,虽然INSERT语句为该州插入了“纽约”,但它存储为“ NY”。

selectionStateFromCassandraCustomType

如果我运行一个INSERT陈述cqlsh使用缩写下手( INSERT INTO us_address (id, street1, street2, city, state, zipcode) VALUES (blobAsUuid(timeuuidAsBlob(now())), '350 Fifth Avenue', '', 'New York', 'NY', '10118'); ),它仍然可以正常工作,如下图所示。

insertingAddressWithCustomStateTypeAbbreviationIntoCassandraDB

在我的示例中,无效状态不会阻止INSERT的发生,而是将状态持久保存为“ UK”(对于未知状态)[请参见UnitedStatesState.getStateAbbreviationAsByteBuffer(String)的实现UnitedStatesState.getStateAbbreviationAsByteBuffer(String)

证明为什么要在Java中实现自定义CQL数据类型的第一个优点就是,能够采用与关系数据库中的检查约束所提供的行为类似的行为。 例如,在这篇文章中,我的示例确保为新行输入的任何州列都是美国的五十个州,哥伦比亚特区或未知的“英国”之一。 不能在该列的值中插入其他值。

自定义数据类型的另一个优点是能够将数据整理成首选格式。 在此示例中,我将每个州名称都更改为大写的两位数缩写。 在其他情况下,我可能想要始终以大写形式存储或始终以小写形式存储或将有限的字符串集映射为数值。 自定义CQL数据类型允许自定义验证和Cassandra数据库中值的表示。

结论

这篇文章介绍了如何在Cassandra中实现自定义CQL数据类型。 随着我越来越多地使用这个概念并尝试不同的方法,我希望就我所做的一些更细微的观察撰写另一篇博客文章。 如本文所显示,编写和使用自定义CQL数据类型非常容易,特别是对于Java开发人员而言。

翻译自: https://www.javacodegeeks.com/2014/07/custom-cassandra-data-types.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker的安装及注意事项

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制&#…

基于CSS的个人网页

前端时间做的CSS作业&#xff1a;基于CSS的个人网页 基于CSS的个人网页 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>吴广林的个人博客</title><link rel"styles…

Java验证(javafx)

验证是核心javafx框架所缺少的一件事。 为了填补这一空白&#xff0c; controlsfx中已经存在一个第三方验证库 。 但是&#xff0c;我有一个问题&#xff1a;它不是在考虑FXML的情况下创建的。 这并不是说它不是一个很好的库&#xff0c;只是错过了这个细节&#xff0c;对我来说…

WAP自助建站 我编程之路的启蒙

如题所示的这篇文章是我心血来潮在网上搜索到的&#xff0c;写的挺让我感同身受的&#xff0c;不妨先看一下原文吧。 原文 不知是偶然还是“冥冥定数”&#xff0c;最后一次访问娃派建站&#xff08;wap.ai&#xff09;已有数十月之久了&#xff0c;突然心血来潮想看看曾经的建…

初始socket模块和巧解粘包问题

1.什么是socket&#xff1f; 两个进程如果需要进行通讯最基本的一个前提能够唯一的标示一个进程&#xff0c;在本地进程通讯中我们可以使用PID来唯一标示一个进程&#xff0c;但PID只在本地唯一&#xff0c;网络中的两个进程PID冲突几率很大&#xff0c;这时候我们需要另辟它径…

webpack常用loader和plugin及打包速度优化

优化 或 也可以用&#xff1a; 备用&#xff1a; 慎用的配置&#xff0c;用的不好会增加打包时间&#xff1a; 代码丑化插件&#xff1a; 更多专业前端知识&#xff0c;请上 【猿2048】www.mk2048.com

react-native 热更新react-native-pushy集成遇到的问题

主要步骤按官方文档实现&#xff0c;这里只记录遇到的一些小坑 官方文档 run-android时NDK报错 前提是NDK已安装并且环境变量已设置 根据报错提示在 android/local.properties文件里加入ndk.dir~/Library/Android/android-ndk-r10e //这里改成你自己的ndk路径 cxxbridge找…

Keil5 仿真测试出现Cannot Load Flash Device Description 解决方法

1.用ST的烧录软件检测&#xff0c;可以烧录对应的Hex文件。 2.点击魔术棒&#xff0c;Debug选项卡检测芯片型号是否和当前芯片对应 3.在Flash Download选项卡中检查发现没有对应的芯片型号 4.点击Add 选项&#xff0c;选择对应的Flash类型如图&#xff1a; 添加Flash类型后&…

Hadoop—MapReducer统计文件的单词出现的个数

1. MapReduce 统计文件的单词出现的个数 Mapper: 处理具体文本&#xff0c;发送结果 Reducer: 合并各个Mapper发送过来的结果 Job: 制定相关配置&#xff0c;框架 Mapper package cn.itcast.hadoop.mr.wordcount;import java.io.IOException;import org.apache.hadoop.io.LongW…

课堂作业2

1、动手动脑 阅读示例: EnumTest.java&#xff0c;运行它&#xff0c;分析运行结果&#xff1f;你能得到什么结论&#xff1f;你掌握了枚举类型的基本用法了吗&#xff1f; public class EnumTest {public static void main(String[] args) {Size sSize.SMALL;Size tSize.LARGE…

(转)详解Vs2008下打包安装程序的一些技巧(含win7下提权限、卸载以及安装时定向到网页)...

1、怎么使得程序窗口左上角和任务栏有图标&#xff0c;如下图所示&#xff1a; 其实这个问题不应该放到程序打包这部分讲&#xff0c;只不过对于一些初学者而言&#xff0c;在这提下也许会有很大的帮助&#xff08;想到自己刚学.net那会了&#xff0c;呵呵&#xff09;。方法之…

项目实战报异常Exception及决绝方案

1、报LifecycleException&#xff0c;再配置一下jdk即可&#xff0c;然后再手动添加maven 解决方法&#xff1a; 然后,手动添加jar包 2、maven 项目,右键maven build启动项目的时候&#xff0c;报下面错误&#xff0c;没有在pom配置tomcat7插件 3、报找不到beans插件:更新一下项…

世界主要遥感卫星

世界主要遥感卫星QuickbirdSpot-4Spot-4法国“太阳神”1A神舟飞船神舟飞船“哈勃”望远镜RADASAT神舟飞船国际空间站国际空间站 SPOT2Shutsacn IKONOS CBERS-1JersSpot-4 “哈勃”望远镜 CBERS-1 Landsat 5美国“KH-11”侦察卫星 Spot-5 ERS Landsat 7OrbView-3 美国间谍卫星…

VMware配置linux网络步骤

1.我们要用桥接网络模式 2.设置桥接网络&#xff0c;VMnet1或者VMnet0就是桥接网络&#xff0c;我们用的就是桥接 VMnet8是NAT 在上面的图配置好ip和dns&#xff0c;要与windowss是同一个网段&#xff0c;网关一般不设置 3.设置linux网络里面设置这4项&#xff0c;记住dns可以不…

使用IntelliJ书签

这是有关IntelliJ的精美书签功能的快速帖子。 IntelliJ使您可以为单行代码添加书签。 将某行添加为书签后&#xff0c;您可以使用多种方法直接跳回到该行。 因此&#xff0c;最好在您经常使用的代码位置添加书签。 要创建一个新书签&#xff0c;只需在代码编辑器中按F11键。 …

ECMA-335 (CLI) 标准 读书笔记——总结CLI类型系统(上)

看到类型系统的概述时&#xff0c;就忍不住按图索骥&#xff0c;想搞清楚CLI如何定义的整个类型系统。于是翻遍了整个标准&#xff0c;将类型系统中最核心的、与运行平台密切相关的类型定义与说明整理了出来&#xff0c;以供理清思路。 标准的第四部指出&#xff0c;CLI的核心是…

centos7安装openjdk8

首先&#xff0c;打开openjdk安装官网 http://openjdk.java.net/install/ 输入安装命令&#xff1a; su -c "yum install java-1.8.0-openjdk" 装完之后会有提示版本跟安装的路径&#xff1b;在/usr/lib/jvm下可以查看到对应的名字&#xff0c;ls-l 配置环境变量&…

CSB文件上传漏洞 -->Day4(图片挂马)

22二号&#xff0c;冬至啦&#xff0c;深圳这边只有5&#xff08;尊嘟好冷啊&#xff09;&#xff0c;写这篇文章的时候都已经是凌晨一点了&#xff0c;相信大部分的人都在温暖的被窝里面了吧&#xff01;&#xff01;&#xff08;可怜的我&#xff0c;还得写writeup&#xff0…

微信小程序禁止刷新之后苹果端还可以下拉的问题

一、问题描述 最近在做一个小程序项目&#xff0c;需要禁止下拉刷新&#xff0c;于是在page.json里面添加了这段话 "enablePullDownRefresh":false 全局关闭下拉刷新&#xff0c;这段话确实禁止了下拉刷新&#xff0c;无论是安卓手机端还是苹果端&#xff0c;但是在…

调试OpenJDK

knowyourmeme.com/photos/531557 THX为mihn 有时调试Java代码还不够&#xff0c;我们需要逐步了解Java的本机部分。 我花了一些时间来实现JDK的正确状态&#xff0c;所以简短的描述可能对开始旅行的人很有用。 我将使用全新的OpenJDK 9&#xff01; 首先&#xff0c;您必须通过…