2

最近、Scala、Spark、Cassandraを使用して大きなデータプロジェクトを開始しました。私は単純なタスクを書いて、カサンドラテーブルから読み込もうとしています。プロパティ名とカラム名を小文字かスネーク(unserscores)のいずれかにしておくと、これを実現できますが、私はスカラコードでラクダケースを使いたいと思います。 Scalaでキャメルケースフォーマットを使用し、cassandraでスネークケースを使用してこれを実現するためのより良い方法はありますか?我々が使用しているDatastax spark cassadraコネクタ - DFをcassandraテーブルに書き込む

スカラ - 2.10.5スパーク - 1.6.2 datastax火花カサンドラコネクタ - 1.6.0カサンドラ - 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は - 現在あるように振る舞うデータフレーム。 – RussS

+0

おかげでRuss、私はRDDを使ってそれを解決することができました。 – siva

答えて

0

RDDSを使用して、火花カサンドラ・コネクタは自動的に下線を列名にキャメルケース入りのプロパティに変換します。おかげで再びここ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

このような単純なユースケースでは、列名を指定すると便利です。しかし、私は多くのネストされた 'caseクラス'を持つ複雑なオブジェクトを保存したい。ラクダの大文字小文字のプロパティをその場で蛇の列名に変換する方法はありますか? – siva

関連する問題