2

Мы недавно начали проект с большими данными, используя Scala, Spark и Cassandra, и я новичок во всех этих технологиях. Я пытаюсь выполнить простую задачу записи и чтения из таблицы cassandra. Я могу добиться этого, если я буду хранить имена свойств и имена столбцов либо в нижнем регистре, либо в виде змеи (unserscores), но я хочу использовать случай верблюда в своем коде scala. Есть ли лучший способ добиться этого, используя формат верблюда в Scala и случай с змеей в cassandra.Datastax spark cassadra connector - запись DF в таблицу cassandra

мы используем

Скала - 2.10.5 искра - 1.6.2 datastax искровой Cassandra-разъем - 1.6.0 Cassandra - 3.0.9.1346 datastax предприятия - 5.0.3

Cassandra стол

CREATE TABLE dev.castable (
id int PRIMARY KEY, 
long_name text, 
name text, 
short_name text) 

Scala код

val conf = new SparkConf() 
     .setAppName("TestHelper") 
     .setMaster("local") 
     .set("spark.cassandra.connection.host","127.0.01") 
    val sc = new SparkContext(conf) 
    val sqlContext = new SQLContext(sc) 

    println("writing data to cassandra") 
    val df = sqlContext.createDataFrame(List(new MyRow(2,Option("long name"), "ss", Option("short name")))) 
    df.write //*** this is not working 
     .cassandraFormat("castable", "dev") 
     .mode(SaveMode.Append) 
     .save() 

    println("reading data from cassandra") //*** This is working fine 
    val rdd = sc.cassandraTable[MyRow]("dev", "castable") 
    rdd.foreach(println) 

Исключение

Exception in thread "main" java.util.NoSuchElementException: Columns not found in table dev.castable: longName, shortName 
at com.datastax.spark.connector.SomeColumns.selectFrom(ColumnSelector.scala:38) 
at com.datastax.spark.connector.writer.TableWriter$.apply(TableWriter.scala:268) 
at com.datastax.spark.connector.RDDFunctions.saveToCassandra(RDDFunctions.scala:36) 
at org.apache.spark.sql.cassandra.CassandraSourceRelation.insert(CassandraSourceRelation.scala:67) 
at org.apache.spark.sql.cassandra.DefaultSource.createRelation(DefaultSource.scala:85) 
at org.apache.spark.sql.execution.datasources.ResolvedDataSource$.apply(ResolvedDataSource.scala:222) 
at org.apache.spark.sql.DataFrameWriter.save(DataFrameWriter.scala:148) 
at com.aktana.spark.util.LocalTestDriver$.main(LocalTestDriver.scala:38) 

Я прочитал, что искровой-Кассандры разъем автоматически выполняет это преобразование автоматически, но он не работает для меня. datastax spark-cassandra-connector

+1

https://datastax-oss.atlassian.net/browse/SPARKC-370 - В настоящее время Dataframes ведет себя, как есть. – RussS

+0

Спасибо, Russ, я могу решить это с помощью RDD. – siva

ответ

0

Использование РДА, искровой Кассандра разъем автоматически преобразует верблюжьи обсаженных свойства подчеркнутых имен столбцов. Еще раз спасибо RussS

Вот как я спасаю объекты случае класса Кассандры стола

val writeRDD = sc.makeRDD(List(new MyRow(2,Option("long name"), "ss", Option("short name")))) 
    writeRDD.saveToCassandra("dev", "castable") 
0

Похоже, что определение MyRow не соответствует определению таблицы cassandra. Попробуйте это:

val df = List((1, "My Long Description", "My Name", "My Short Name")).toDF("id", "long_name", "name", "short_name") 
+0

Задание имен столбцов хорошо подходит для простых случаев использования, подобных этому. Но я хочу сохранить сложный объект со многими вложенными «классами». Есть ли способ преобразовать свойства корпуса верблюда в имена столбцов колокола змеи на лету? – siva

Смежные вопросы