从Spark写入Cassandra时忽略大小写

3

I have a spark dataframe:

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接受我的数据而忽略大小写?或者是否有一种简单的方法可以将所有列转换为小写(即使在结构体、结构体数组中也是如此)?


1
检查表描述。Cassandra 会创建小写列,除非用双引号括起来。 - undefined_variable
@undefined_variable 很抱歉,但我真的不明白你的意思。我知道cassandra会将列名创建为小写,我在我的帖子中已经说过了。你建议我直接在cassandra中使用驼峰命名法来创建列吗? - Steven
2个回答

3

Spark Cassandra Connector 总是“引用”表和列的名称,因此它们应该作为带双引号的“引用”名称在模式中创建,或者您需要在数据框架中使用小写名称-将数据框架的所有列重命名为小写名称不应该很难。


1
如果您希望Cassandra不要使用小写字母创建列,请在创建表查询中使用双引号引用列名,如下所示:
创建表 tablename(“columnname” datatype);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接