从spark写入cassandra时忽略大小写

Ignoring case when writing to cassandra from spark

我有一个 spark 数据框:

df1 = spark.createDataFrame(
  [
    (1,2),
    (3,4),
  ],
  ["Col1", "Col2"]
)

我在 cassandra 中创建了等效的 table:

CREATE table external.test1(
    Col1 int, 
    Col2 int, 
    primary key (Col1) 
) ;

使用包 spark-cassandra-connector,我尝试将我的数据框插入我的 table:

df1.write.format(
  'org.apache.spark.sql.cassandra'
).options(
  keyspace='external',
  table='test1'
).save()

并收到错误:

java.util.NoSuchElementException: Columns not found in table 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 接受我的数据而忽略大小写?或者有没有一种简单的方法可以将我所有的列转换为小写(即使在结构、结构数组中,...)?

Spark Cassandra Connector 始终 "quotes" 表和列的名称,因此应将它们创建为架构中的 "quoted" 名称(双引号),或者您需要使用 lower-case 数据框中的名称 - 将数据框中的所有列重命名为小写应该不是很难。

如果您不希望 cassandra 以小写形式创建列,请在您的创建 table 查询中为您的列名称使用双引号,如下所述:

创建 table tablename ("columnname" 数据类型);