我们正在使用this代码创建一个cassandra表:
df.createCassandraTable(
keyspace,
table,
partitionKeyColumns = partitionKeyColumns,
clusteringKeyColumns = clusteringKeyColumns)
其中df
是org.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
答案 0 :(得分:0)
2.0.0-M3
版spark-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>
并修复了问题