如何防止短字节和字节在使用 spark-cassandra 连接器创建 cassandra 表时被提升为 int



我们使用以下代码创建一个Cassandra表:

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

其中df是一个org.apache.spark.DataFrame,但我们发现创建的表不使用与DataFrame相同的数据类型。具体来说,我们在数据帧中有一些类型为 short(又名 smallint(和 byte(又名 tinyint(的列,它们在 cassandra 表中被提升为 int。我们不希望这种行为。我们如何解决这个问题?

编辑

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

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 

我们的卡桑德拉集群是

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

spark-cassandra-connector_2.112.0.0-M3版本没有这些更改。 解决方案是升级到如下所示的2.0.2

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

解决了问题

相关内容

最新更新