簡體   English   中英

Datastax Spark Cassandra連接器-將DF寫入Cassandra表

[英]Datastax spark cassandra connector - writing DF to cassandra table

我們最近開始使用Scala,Spark和Cassandra進行大數據項目,而我對所有這些技術都是陌生的。 我正在嘗試執行簡單的任務來讀寫cassandra表。 如果我將屬性名稱和列名稱全部保留為小寫或蛇形(非下划線),則可以實現此目的,但是我想在我的scala代碼中使用駝峰式大小寫。 有沒有更好的方法可以在Scala中使用駝峰案例格式以及在cassandra中使用蛇形案例來實現這一目標。

我們正在使用

Scala-2.10.5 spark-1.6.2 datastax spark-cassandra-connector-1.6.0 cassandra-3.0.9.1346 datastax enterprise-5.0.3

卡桑德拉表

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)

我讀到spark-cassandra-connector自動自動執行此轉換,但不適用於我。 datastax spark-cassandra-connector

看來您的MyRow定義與cassandra表定義不匹配。 嘗試這個:

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

使用RDD,spark-cassandra-connector會將駝峰式屬性自動轉換為帶下划線的列名。 再次感謝RussS

這是我將案例類對象保存到cassandra表中的方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM