从Spark写入Cassandra时忽略大小写

时间:2019-01-21 16:01:01

标签: python apache-spark cassandra pyspark

我有一个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数组中,...)?

2 个答案:

答案 0 :(得分:1)

Spark Cassandra Connector始终“引用”表和列的名称,因此要么在架构中将它们创建为“引用”名称(双引号),要么需要在数据中使用小写名称框架-将数据框架的所有列重命名为小写不是很困难。

答案 1 :(得分:0)

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

创建表tablename(“列名”数据类型);