我有一个sparkDataframe:
df1 = spark.createDataFrame(
[
(1,2),
(3,4),
],
["Col1", "Col2"]
)
我在cassandra中创建了等效表:
CREATE table external.test1(
Col1 int,
Col2 int,
primary key (Col1)
) ;
使用软件包spark cassandra连接器,我尝试将Dataframe插入表中:
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接受我的数据而忽略这个案子?或者有没有一种简单的方法将我的所有列转换成小写(甚至在一个结构、一个结构数组……)呢?
2条答案
按热度按时间ttygqcqt1#
如果希望cassandra不使用小写创建列,请在create table查询中使用双引号作为列名,如下所述:
创建表tablename(“columnname”数据类型);
bxjv4tth2#
spark cassandra connector总是“引用”表和列的名称,所以要么在模式中将它们创建为“引用”的名称(用双引号),要么在数据框中使用小写名称—将数据框中的所有列重命名为小写应该不是很难。