Игнорирование случая при записи на кассандру от искры - PullRequest
0 голосов
/ 21 января 2019

У меня есть датакадр искры:

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

Я создал эквивалентную таблицу в Кассандре:

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 сохраняет прописные буквы в именах столбцов.

Следовательно, этот код выполняется без ошибок:

df1.select(
    *(map(str.lower, df1.columns))
).write.format(
  'org.apache.spark.sql.cassandra'
).options(
  keyspace='external',
  table='test1'
).save()

Как я могу заставить Кассандру принять мои данные, игнорируя дело? Или есть простой способ преобразовать все мои столбцы в нижний регистр (даже внутри структуры, массива структур, ...)?

1 Ответ

0 голосов
/ 29 июня 2019

Spark Cassandra Connector всегда «заключает в кавычки» имена таблиц и столбцов, поэтому либо они должны создаваться как «заключенные в кавычки» имена в схеме (в двойных кавычках), либо вам нужно использовать строчные имена в ваших данныхфрейм - не должно быть очень сложно переименовать все столбцы вашего фрейма данных в нижний регистр.

...