1

나는 다음과 같은 카산드라 DM 있습니다스파크 - 삽입 문제

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 문은 모두 잘 작동합니다. 이제 스파크 스트리밍 앱에서 데이터를 가져 와서 내 CQL 문과 같은 스타일의 데이터 프레임으로 포맷합니다. 나는 문의 각 세트에 대해 문의 한 여러 세트를 얻을 2. 이제

내가 처음 CQL 문 불꽃처럼 내 dataframe는 카산드라 예외가 발생합니다 저장할 때 문제가 있습니다

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 : 내가 버지니아를 추가 할 때

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

:

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

가 한 Statment 저장 내 lue 2 열 내 데이터 프레임 문을 잘 작동합니다.

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

Datamodel을 변경하지 않고 CQL 문과 같이 작동시키는 방법이 있습니까?

+0

정적 열이있는 버그처럼 보입니다. Jira 파일을 제출해야합니다. – RussS

답변

0

정적 열은 동일한 파티션의 모든 행에서 공유하는 특수 열입니다. 2013-01 ',

ctest (ID, 타임 스탬프, 값 1) 값으로 삽입 (233177ff-439b-4a2d-a8b0-4db742b4bc1b : 첫 번째 삽입 예에서, CQL을 사용하면 파티션에 대해 정적 데이터 만 삽입 할 수 있습니다 -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 

이 합성 행을 생성한다; 행처럼 보이지만 그것은 단지 파티션 키와 정적 컬럼입니다. 기본 키를 갖는 실제 행을 삽입하면 null 값이 사라집니다 :

삽입 ctest로 (ID 1, 값 2) 가치 (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(", ")}") 
    } 

는 매트 브라운으로 책 학습 아파치 카산드라 정적 만 설명 페이지 53 ~ 54에 삽입합니다.

+0

감사합니다. 그것은 매우 도움이되었습니다. – ldue