Вы уверены, что ignoreNulls
не работает для вас? Кассандра выводит null
, когда в данной ячейке нет значения. Вы можете проверить, действительно ли данные записаны в SSTable, используя инструмент sstabledump
- вы обязательно увидите ячейки с прикрепленной информацией об удалении (именно так хранятся нули).
Вот пример запуска Spark без ignoreNulls
(по умолчанию), а ignoreNulls
имеет значение true
. Тестирование проводилось на DSE 5.1.11, который имеет более старую версию коннектора, но соответствует Cassandra 3.11.
Давайте создадим тестовую таблицу следующим образом:
create table test.t3 (id int primary key, t1 text, t2 text, t3 text);
без ignoreNulls
- нам нужен следующий код для тестирования:
case class T3(id: Int, t1: Option[String], t2: Option[String], t3: Option[String])
val rdd = sc.parallelize(Seq(new T3(1, None, Some("t2"), None)))
rdd.saveToCassandra("test", "t3")
Если мы посмотрим на данные, используя cqlsh
, мы увидим следующее:
cqlsh:test> SELECT * from test.t3;
id | t1 | t2 | t3
----+------+----+------
1 | null | t2 | null
(1 rows)
После выполнения nodetool flush
мы можем заглянуть в SSTables. Вот что мы увидим здесь:
>sstabledump mc-1-big-Data.db
[
{
"partition" : {
"key" : [ "1" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 30,
"liveness_info" : { "tstamp" : "2018-11-06T07:53:38.418171Z" },
"cells" : [
{ "name" : "t1", "deletion_info" : { "local_delete_time" : "2018-11-06T07:53:38Z" }
},
{ "name" : "t2", "value" : "t2" },
{ "name" : "t3", "deletion_info" : { "local_delete_time" : "2018-11-06T07:53:38Z" }
}
]
}
]
}
]
Вы можете видеть, что для столбцов t1
& t3
, которые были нулевыми, есть поле deletion_info
.
Теперь удалите данные с помощью TRUNCATE test.t3
и снова запустите spark-shell, установив для ignoreNulls
значение true:
dse spark --conf spark.cassandra.output.ignoreNulls=true
После выполнения того же кода Spark мы увидим те же результаты в cqlsh
:
cqlsh:test> SELECT * from test.t3;
id | t1 | t2 | t3
----+------+----+------
1 | null | t2 | null
Но после выполнения сброса sstabledump
показывает совершенно другую картину:
>sstabledump mc-3-big-Data.db
[
{
"partition" : {
"key" : [ "1" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 27,
"liveness_info" : { "tstamp" : "2018-11-06T07:56:27.035600Z" },
"cells" : [
{ "name" : "t2", "value" : "t2" }
]
}
]
}
]
Как видите, у нас есть только данные для столбца t2
, и нет упоминаний о столбцах t3
& t1
, которые были бы нулевыми.