在使用spark-cassandra-connector创建cassandra表时,如何防止短和字节升级为int?

时间:2017-05-23 16:46:44

标签: spark-cassandra-connector

我们正在使用this代码创建一个cassandra表:

df.createCassandraTable(
        keyspace,
        table,
        partitionKeyColumns = partitionKeyColumns,
        clusteringKeyColumns = clusteringKeyColumns)

其中dforg.apache.spark.DataFrame,但我们发现创建的表格不使用与DataFrame相同的数据类型。具体来说,我们在数据框中有一些类型为short(又名smallint)和byte(又名tinyint)的列,它们会被提升为int in卡桑德拉表。我们不希望这种行为。我们该如何解决这个问题?

编辑:进行一些编辑以记录我们的调查。调用createCassandraTable时的调用堆栈似乎会点击this代码,如果byte小于int,则会将com.datastax.driver.core.ProtocolVersion提升为V4

case ByteType => if (protocolVersion >= V4) TinyIntType else IntType

但是我们在日志中已经验证我们确实使用了协议的V4。

17/05/24 17:43:42 INFO com.myApp$: com.datastax.driver.core.ProtocolVersion = V4 
17/05/24 17:43:42 INFO com.myApp$: ProtocolVersion.NEWEST_SUPPORTED = V4 

我们的cassandra集群是

cqlsh> show version;
[cqlsh 5.0.1 | Cassandra 3.0.11 | CQL spec 3.4.0 | Native protocol v4]

我们使用

<dependency>
            <groupId>com.datastax.spark</groupId>
            <artifactId>spark-cassandra-connector_2.11</artifactId>
            <version>2.0.0-M3</version>
        </dependency>

在我们的依赖项中。

DataFrameFunctions.scala
       Schema.scala
       DataFrameColumnMapper.scala
       ColumnType.scala

1 个答案:

答案 0 :(得分:0)

2.0.0-M3spark-cassandra-connector_2.11版没有these次更改。解决方案是升级到2.0.2,如下所示:

<dependency>
     <groupId>com.datastax.spark</groupId>
     <artifactId>spark-cassandra-connector_2.11</artifactId>
     <version>2.0.2</version>
</dependency>

并修复了问题