通过Java + Spark + SparkSession在Cassandra表中插入/更新行的最佳方法是什么

时间:2016-10-29 22:06:29

标签: java apache-spark cassandra cql

这是通过 Java + Spark + SparkSession 从cassandra表中获取数据的方法:

SparkSession spark = SparkSession
          .builder()
          .appName("JavaDemoDataSet")
          .config("spark.sql.warehouse.dir", "/file:C:/temp")
          .config("spark.cassandra.connection.host", "127.0.0.1")
          .config("spark.cassandra.connection.port", "9042")
          .master("local[2]")
          .getOrCreate();

 Dataset<Row> dataset = spark.read()
        .format("org.apache.spark.sql.cassandra")
        .options(new HashMap<String, String>() {
            {
                put("keyspace", "chat");
                put("table", "dictionary");
            }
        })
        .load()
        .filter("value_id BETWEEN 1 AND 5");

但是当我正在研究如何在这个表中添加或修改行时(至少有一行) - 我无法找出最佳方法。 例如,我正在使用GUI开发简单的应用程序,我需要在“Dictionary”表中添加一个新值。所以,在这种情况下,从我的角度来看 - 我不需要DataSet来做到这一点。

当我研究如何通过SparkSession添加一行时 - 我找不到Java + Spark + Sparksession示例如何做到这一点。 我绝对可以通过 Statement 使用CQL语句来做到这一点,但是哪种方法最好更新或添加1或2行?特别是当我使用SparkSession来阅读它们时。

我会非常感谢例子(甚至超链接,我研究了很多,但可能是我错过了一些重要的东西),如果可能的话,因为我对这一切都很陌生。

谢谢!

2 个答案:

答案 0 :(得分:2)

我强烈建议不要使用Spark进行单行更新。内置连接器方法面向大量数据,并且单行更改可能效率非常低。直接使用驱动程序或使用CassandraConnector接口要好得多。

https://github.com/datastax/spark-cassandra-connector/blob/master/doc/1_connecting.md#connecting-manually-to-cassandra

答案 1 :(得分:2)

以下是使用Java + SparkSession + CassandraConnector进行保存和读取的示例。

public class SparkCassandraDatasetApplication {
public static void main(String[] args) {
     SparkSession spark = SparkSession
      .builder()
      .appName("SparkCassandraDatasetApplication")
      .config("spark.sql.warehouse.dir", "/file:C:/temp")
      .config("spark.cassandra.connection.host", "127.0.0.1")
      .config("spark.cassandra.connection.port", "9042")
      .master("local")
      .getOrCreate();

    //Data
    MyData data = new MyData();
    data.setId("111");
    data.setUsername("userOne");
    List<MyData> users = Arrays.asList(data);
    Dataset<MyData> datasetWrite = spark.createDataset(users, Encoders.bean(MyData.class));

    //Save data to Cassandra
    datasetWrite.write().format("org.apache.spark.sql.cassandra").options(new HashMap<String, String>() {
        {
            put("keyspace", "mykeyspace");
            put("table", "mytable");
        }
    }).mode(SaveMode.Append).save();

    //Read data back
    Dataset<Row> datasetRead = spark.read().format("org.apache.spark.sql.cassandra")
            .options(new HashMap<String, String>() {
                {
                    put("keyspace", "mykeyspace");
                    put("table", "mytable");
                }
            }).load();

    datasetRead.show();
    spark.stop();
   }
}