【问题标题】:Cassandra store list of objectsCassandra 存储对象列表
【发布时间】:2017-12-01 00:13:34
【问题描述】:

我需要在 cassandra 中存储地图列表。那可能吗? 这是我的数据的 json 表示:

{
   "deviceId" : "261e92b8-91af-40da-8ba4-c39d821472ec",
   "sensors": [
   {
       "fieldSensorId": "sensorID",
       "name": "sensorName",
       "location": "sensor location",
       "unit": "value units",
       "notes": "notes"
   },
   {
      "fieldSensorId": "sensorID 2",
      "name": "sensorName 2",
      "location": "sensor location 2",
      "unit": "value units",
      "notes": "notes"
    }
  ]
}

CQL:

CREATE TABLE device_sensors (
    device_id text,
    sensors list<frozen <map<text,text>>>,
    time timeuuid,
    PRIMARY KEY (device_id)
)

我仍然无法插入任何数据。在 cassandra 中存储此类数据的正确方法是什么?稍后我将需要查询传感器列表 创建一个传感器表并使用 sensor > 来引用传感器是否更明智?

【问题讨论】:

  • 你用什么插入数据?在 CQLSH 中它工作得很好:insert into device_sensors (device_id , sensors) VALUES ('121342', [{'1':'2','3':'4'}]);
  • 我正在使用 spring-boot-data-cassandra。我的实体:@Column("device_id") @PrimaryKeyColumn(name = "device_id", ordinal = 0, type = PrimaryKeyType.PARTITIONED) private UUID deviceId;私有 UUID 时间;私有 List> 传感器;错误是:“com.datastax.driver.core.exceptions.InvalidQueryException:字符串没有验证。”

标签: list cassandra storage


【解决方案1】:

我认为问题在于您在CQL中将devide_id声明为text,但您在源代码中声明了UUID,并且Spring在尝试插入数据时将其映射为相应的类型。您可以尝试将@CassandraType(type = Name.TEXT) 添加到deviceId 声明中。您还可以删除 @Column 声明 - @PrimaryKeyColumn 应该足够了。

或者您可以更改表定义以将device_id声明为UUID

【讨论】:

  • 现在工作。 device_id 类型错误。调整为 uuid,现在可以使用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多