我有一个Spark数据框:
df1 = spark.createDataFrame(
[
(1,2),
(3,4),
],
["Col1", "Col2"]
)
我在cassandra中创建了等效表:
CREATE table external.test1(
Col1 int,
Col2 int,
primary key (Col1)
) ;
使用软件包spark-cassandra-connector,我尝试将数据框插入表中:
df1.write.format(
'org.apache.spark.sql.cassandra'
).options(
keyspace='external',
table='test1'
).save()
并收到错误:
java.util.NoSuchElementException:在表中找不到列 external.test1:Col1,Col2
我发现错误是由于spark和Cassandra之间的大小写不匹配所致。 Cassandra忽略了脚本的大写字母,并创建了全部小写的列。 Spark将大写字母保留在列名称中。
因此,此代码执行无误:
df1.select(
*(map(str.lower, df1.columns))
).write.format(
'org.apache.spark.sql.cassandra'
).options(
keyspace='external',
table='test1'
).save()
如何强制Cassandra忽略案件接受我的数据?还是有一种简单的方法可以将我所有的列都转换为小写(即使在一个struct,struct数组中,...)?
答案 0 :(得分:1)
Spark Cassandra Connector始终“引用”表和列的名称,因此要么在架构中将它们创建为“引用”名称(双引号),要么需要在数据中使用小写名称框架-将数据框架的所有列重命名为小写不是很困难。
答案 1 :(得分:0)
如果您希望cassandra不创建小写的列,请在创建表查询中为列名使用双引号,如下所述:
创建表tablename(“列名”数据类型);