Строка поля Кассандра против длинного

Хорошо, я схожу с ума здесь. Есть ряд поведений, которые я не могу объяснить с Кассандрой, и я даже не уверен, связаны ли они или нет.

Я создал таблицу следующим образом (для краткости не показаны все столбцы):

create column family cachekey  
    with comparator = UTF8Type  
    and column_metadata =  
    [  
    {  
        column_name : accountNumber,  
        validation_class : UTF8Type  
    },  
    {  
        column_name : homeId,  
        validation_class : LongType  
    }  
 ...  
];

Некоторые записи были добавлены в эту таблицу (не мной). Теперь, когда я отображаю схему, я не уверен, почему я не вижу столбцы, которые я создал

[default@cachekeydata] show schema;
...

use cachekeydata;

create column family cachekey  
  with column_type = 'Standard'  
  and comparator = 'UTF8Type'  
  and default_validation_class = 'BytesType'  
  and key_validation_class = 'BytesType'  
  and read_repair_chance = 0.1  
  and dclocal_read_repair_chance = 0.0  
  and gc_grace = 864000  
  and min_compaction_threshold = 4  
  and max_compaction_threshold = 32  
  and replicate_on_write = true  
  and compaction_strategy = 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy'  
  and caching = 'KEYS_ONLY'  
  and compression_options = {'sstable_compression' :   'org.apache.cassandra.io.compress.SnappyCompressor'};  

Теперь, что действительно озадачивает меня: когда я извлекаю данные из своего Java-кода, я получаю исключение нулевого указателя при попытке получить длинную строку, но не при извлечении строки для некоторых записей:

System.out.println("Mac=" + mac);
System.out.println("  cidx=<" + result.getStringValue("homeId",null) + ">");
System.out.println("  cidx=<" + result.getLongValue("homeId",null) + ">");
System.out.println("  cidx=<" + result.getColumnByName("homeId").getLongValue() + ">");

приводит к:

Mac=001DD67CFF46
  cidx=<50190074>
  cidx=<3832617404583655220>
  cidx=<3832617404583655220>
Mac=001DCFE2122C
  cidx=<3663580>

сопровождаемый NullPointerException. Другими словами, result.getStringValue("homeId",null) возвращает 3663580, но result.getLongValue("homeId",null) вызывает исключение NullPointerException при запуске следующей строки внутри кода библиотеки Cassandra:

LongSerializer.get().fromBytes(column.getValue());

Наконец, отображение этих же двух записей, как указано выше, из консоли Cli не показывает ничего подозрительного для меня:

[default@cachekeydata] get cachekey[utf8('001DD67CFF46')];
=> (column=accountNumber, value=30373833373132303730323036, timestamp=1361305382124)
=> (column=corp, value=3037383337, timestamp=1361305382124)
=> (column=homeId, value=3530313930303734, timestamp=1361305382124)
=> (column=zip, value=3130343732, timestamp=1361305382124)
Returned 4 results.
Elapsed time: 70 msec(s).
[default@cachekeydata] get cachekey[utf8('001DCFE2122C')];
=> (column=accountNumber, value=30373830383132333437323032, timestamp=1361305376659)
=> (column=corp, value=3037383038, timestamp=1361305376659)
=> (column=homeId, value=33363633353830, timestamp=1361305376659)
=> (column=zip, value=3036393033, timestamp=1361305376659)
Returned 4 results.
Elapsed time: 45 msec(s).

Мои вопросы:

  • Q1. большой вопрос Почему я получаю нулевой указатель в примере выше?
  • Q2. Меньшие:
    • Q2a. это то, что я наблюдаю в 3 нормально, учитывая, как я настраиваю таблицу в 1?
    • Q2b. почему моя строка и длинные значения не совпадают?

1 ответ

Не уверен, что ответ будет полезен кому-либо, но данные, которые должны были быть длинными, были вставлены в виде строки. По-видимому, это вызвало как минимум две проблемы, которые я объяснил выше:

  • отображать другой результат, независимо от того, были ли данные прочитаны как String или Long (то, к чему я не привык из мира Oracle)
  • вызывая эти случайные исключения нулевого указателя
Другие вопросы по тегам