从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" 数据类型);
我有一个 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" 数据类型);