1

У меня есть следующие Cassandra DM:Спарк Cassandra Connector ведет себя отличается от CQL оболочки - Вставить вопрос

CREATE TABLE table (
    id uuid, 
    timestamp timestamp STATIC, 
    value1 text STATIC, 
    value2 int, 
    value3 text, 
    data map <text,text>, 
    PRIMARY KEY (id, value2) 
); 

До сих пор так хорошо. Теперь я должен типов форматов я хочу, чтобы вставить первую:

INSERT INTO table (id, timestamp, value1) 
VALUES (<uuid>,<timestamp>,<some-string>); 

и

INSERT INTO table (id, value2, value3, data) 
VALUES (<some-id>,<some-int>,<some-string>, <some-simple-json-map>) 

Оба заявления CQL работают отлично. Теперь я разрабатываю приложение для создания искрообразования, получающее данные и форматирование его в dataframes, стилизованные как мои операторы CQL. Я получаю для каждого набора заявления 1 несколько комплектов заявления 2.

Теперь у меня есть вопрос, когда я сохранить dataframe как первое заявление искра CQL бросает исключение Кассандры:

java.lang.IllegalArgumentException: 

     Some primary key columns are missing in RDD or have not been selected: value2 
      at com.datastax.spark.connector.writer.TableWriter$.checkMissingPrimaryKeyColumns(TableWriter.scala:190) 
      at com.datastax.spark.connector.writer.TableWriter$.checkColumns(TableWriter.scala:257) 
      at com.datastax.spark.connector.writer.TableWriter$.apply(TableWriter.scala:275) 
      at com.datastax.spark.connector.RDDFunctions.saveToCassandra(RDDFunctions.scala:36) 
      ... 

Здесь схема мой dataframe:

root 
    |-- id: string (nullable = true) 
    |-- timestamp: long (nullable = true) 
    |-- value1: string (nullable = true) 

мои сохранить Постулаты:

data.select("id", "timeStamp", "value1") 
    .write.format("org.apache.spark.sql.cassandra") 
     .mode(SaveMode.Append) 
     .options(Map("keyspace" -> "some_keyspace","table" -> "table")) 
     .save() 

Когда я добавить в lue 2 в мой dataframe, оператор работает отлично.

root 
|-- id: string (nullable = true) 
|-- timestamp: long (nullable = true) 
|-- value1: string (nullable = true) 
|-- value2: integer (nullable = false) 

Есть ли способ заставить его работать как инструкция CQL без изменения Datamodel?

+0

Похож на ошибку со статическими столбцами, вы должны подать Jira – RussS

ответ

0

Статический столбец - это специальный столбец, который разделяют все строки одного и того же раздела. В первом примере вставки CQL позволяет вставлять статические данные только для раздела:

вставки в CTest (идентификатор, метка времени, значение1) VALUES (233177ff-439b-4a2d-a8b0-4db742b4bc1b, «2013-01 -01 00: 05 + 0000 ',' one ');

select * from ctest;

id         | value2 | timestamp    | value1 | data | value3 
--------------------------------------+--------+--------------------------+--------+------+-------- 
233177ff-439b-4a2d-a8b0-4db742b4bc1b | null | 2013-01-01 00:05:00+0000 | one | null | null 

Это создает синтетическую строку; он выглядит как строка, но это всего лишь ключ раздела и статический столбец. Если вставить реальную строку, имеющую первичный ключ, то нулевое значение исчезнет:

вставки в CTest (идентификатор, значение2) VALUES (233177ff-439b-4a2d-a8b0-4db742b4bc1b, 1);

select * from ctest;

id         | value2 | timestamp    | value1 | data | value3 
--------------------------------------+--------+--------------------------+--------+------+-------- 
233177ff-439b-4a2d-a8b0-4db742b4bc1b |  1 | 2013-01-01 00:05:00+0000 | one | null | null 

(1 rows) 

Выполнив две вставки у вас есть только одна строка.

Разъем Spark-Cassandra более строгий и не позволяет вставлять только статические данные для раздела. Код соединителя проверяет, определены ли все столбцы в первичном ключе. Он находит два столбца в первичном ключе (id, value2), устанавливается только один, и он вызывает ошибку. Ниже приведена проверка в com.datastax.spark.connector.writer.TableWriter:

private def checkMissingPrimaryKeyColumns(table: TableDef, columnNames: Seq[String]) { 
    val primaryKeyColumnNames = table.primaryKey.map(_.columnName) 
    val missingPrimaryKeyColumns = primaryKeyColumnNames.toSet -- columnNames 
    if (missingPrimaryKeyColumns.nonEmpty) 
     throw new IllegalArgumentException(
     s"Some primary key columns are missing in RDD or have not been selected: ${missingPrimaryKeyColumns.mkString(", ")}") 
    } 

Для немного больше фона на это, книга обучения Apache Cassandra По Мат Браун обсуждает статические только вставки на стр 53-54.

+0

Спасибо. Это было очень полезно. – ldue