当前位置: 首页 > 知识库问答 >
问题:

使用datastax驱动程序,如何将非基本列读取为JSON字符串?

裴俊雅
2023-03-14

我的cassandra表中有几个非基元列。其中一些是用户定义类型的UDT。

在通过datastax驱动程序查询它们时,我想将这些UDT转换为JSON值。更具体地说,我想为下面的value对象获取JSON字符串:

        Row row = itr.next();
        ColumnDefinitions cds = row.getColumnDefinitions();
        cds.asList().forEach((ColumnDefinitions.Definition cd) -> {
            String name = cd.getName();
            Object value = row.getObject(name);
      }

我经历过http://docs.datastax.com/en/developer/java-driver/3.1/manual/custom_codecs/

但我不想为我所有的UDT添加一个编解码器。

考虑到使用Datastax Java驱动程序以JSON形式查询行,我也尝试了以下方法:

row.getString(name)

但它给了我一个错误:Codec找不到请求的操作:[set

驱动程序能在不显式干预编解码器的情况下直接返回JSON吗?


共有1个答案

何楷
2023-03-14

使用toJson方法

从Apache Cassandra™的2.2版开始,toJson方法返回对象的json表示形式。

例子:

CREATE TYPE fullname (
    firstname text,
    lastname text
);

CREATE TABLE users (
    id uuid PRIMARY KEY,
    direct_reports set<frozen<fullname>>,
    name frozen<fullname>
);

现在,您可以选择direct_reports并将其命名为json

SELECT id,toJson(direct_reports) as direct_reports,toJson(name) as name FROM users ;

这里我将toJson(direct_reports)asdirect_reportstoJson(name)重命名为name,这样您就可以使用行了。getString(“直接报告”)行。getString(“name”)获取直接报告json和名称json。

输出:

 id                  | 62c36092-82a1-3a00-93d1-46196ee77204
 direct_reports      | [{"firstname": "Naoko", "lastname": "Murai"}, {"firstname": "Sompom", "lastname": "Peh"}]
 name                | {"firstname": "Marie-Claude", "lastname": "Josset"}
 类似资料:
  • 我从CLI中创建了这样的专栏家族- 现在,我试图使用Datastax Java驱动程序插入到这个列系列中- 但是,如果我试图插入到我在中创建的另一个表中,我可以插入到该表中。 任何帮助都将不胜感激。

  • 我们正在尝试使用DataStax驱动程序将CSV文件中的数据插入Cassandra。有哪些方法可以做到这一点? 我们目前使用运行cqlsh从CSV文件加载。

  • 我正在使用php的Datastax Cassandra驱动程序,希望能够检查是否查询失败,在数据库中没有找到结果。现在,如果查询失败,日志报告如下 如果查询成功,它将返回预期的数据。下面是函数 根据发布的建议,我最后做了以下几点 谢谢你的建议

  • 问题内容: 我在环境中使用mongodb本机驱动程序,并且需要将字符串转换为ObjectId才能在更新查询中使用它,我该怎么做? 问题答案: 使用ObjectId(nodejs driver doc ) 当您具有表示BSON ObjectId的字符串(例如,从Web请求接收)时,则需要将其转换为ObjectId实例:

  • 我有一个java程序正在使用HortonWorks的JDBC驱动程序连接到VirtualBox中的数据库。一切都运行得很好,但我在sql查询中的冒号有问题。 我正在尝试设置的rowid是“:rowid:”。我在前面和后面添加冒号,使列名对于其他应用程序是唯一的。现在冒号必须在那里,我想知道是否有一种方法使用官方站点的Hortonworks JDBC Driver for Apache Hive(v

  • 问题内容: 我正在使用datastax Java驱动程序3.1.0连接到cassandra集群,而我的cassandra集群版本是2.0.10。 下面是我用来连接cassandra集群的单例类。 首先需要使用哪些设置来连接本地cassandra节点,如果它们已关闭,则仅与远程节点通信。我的池配置选项也就在这里,上面的代码中正在使用该选项? 问题答案: 默认情况下,datastax驱动程序将仅连接到