从spark向cassandra写入时忽略大小写

lp0sw83n  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(543)

我有一个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接受我的数据而忽略这个案子?或者有没有一种简单的方法将我的所有列转换成小写(甚至在一个结构、一个结构数组……)呢?

ttygqcqt

ttygqcqt1#

如果希望cassandra不使用小写创建列,请在create table查询中使用双引号作为列名,如下所述:
创建表tablename(“columnname”数据类型);

bxjv4tth

bxjv4tth2#

spark cassandra connector总是“引用”表和列的名称,所以要么在模式中将它们创建为“引用”的名称(用双引号),要么在数据框中使用小写名称—将数据框中的所有列重命名为小写应该不是很难。

相关问题