我们使用以下代码创建一个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.11
的2.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>
解决了问题