如何使用联接在Spark结构化流中处理备份方案?

时间:2019-09-27 12:16:00

标签: java apache-spark cassandra apache-spark-sql

我正在使用spark-sql 2.4.1,spark-cassandra-connector_2.11-2.4.1.jar和java8。我有一个方案,我需要将流数据与C * / Cassandra表数据连接起来。

我有两个表格,分别是“ master_table ”和“ backup_table

table kspace.master_table(
    statement_id int,
    statement_flag text,
    statement_date date,
    x_val double,
    y_val double,
    z_val double,
    PRIMARY KEY (( statement_id ), statement_date)
) WITH CLUSTERING ORDER BY ( statement_date DESC );

table kspace.backup_table(
    statement_id int,
    statement_flag text,
    statement_date date,
    x_val double,
    y_val double,
    z_val double,
    backup_timestamp timestamp,
    PRIMARY KEY ((statement_id ), statement_date, backup_timestamp )
) WITH CLUSTERING ORDER BY ( statement_date DESC,   backup_timestamp DESC);

每个流记录都将带有“ statement_flag”,可能是“ I”或“ U”。

  1. 如果出现带有“ I”的记录,我们将直接插入“ master_table”。
  2. 如果带有“ U”的记录到来,则需要检查“ master_table”中是否有给定(statement_id),statement_date的记录。
  3. 如果“ master_table”中有记录,则将其复制到具有当前时间戳(即backup_timestamp)的“ backup_table”中。
  4. 使用最新记录更新“ master_table”中的记录。

应该执行以下代码,但不能。

Dataset<Row> baseDs = //streaming data from topic
Dataset<Row> i_records = baseDs.filter(col("statement_flag").equalTo("I"));
Dataset<Row> u_records = baseDs.filter(col("statement_flag").equalTo("U"));

String keyspace="kspace";
String master_table = "master_table";
String backup_table = "backup_table";

Dataset<Row> cassandraMasterTableDs = getCassandraTableData(sparkSession, keyspace , master_table);

writeDfToCassandra(baseDs.toDF(), keyspace, master_table);

u_records.createOrReplaceTempView("u_records");
cassandraMasterTableDs.createOrReplaceTempView("persisted_records");

Dataset<Row> joinUpdatedRecordsDs =  sparkSession.sql(
            " select p.statement_id, p.statement_flag, p.statement_date,"
            + "p.x_val,p.y_val,p.z_val "
            + " from persisted_records as p "
            + "join u_records as u "
            + "on p.statement_id = u.statement_id  and p.statement_date = u.statement_date");

Dataset<Row> updated_records = joinUpdatedRecordsDs
  .withColumn("backup_timestamp", current_timestamp());

writeDfToCassandra(updated_records.toDF(), keyspace, backup_table); 

“ master_table”中的所有内容都复制到backup_table中。实际上,它假定只复制以前版本的记录,而不是最新版本。

假设仅从master_table复制记录的先前版本,但所有内容均已复制到backup_table

如何仅将master_table中的记录的先前版本仅复制到backup_table中而不是最新记录?

样本数据

对于带有“ I”标志的第一条记录

master_table

enter image description here

backup_table

enter image description here

对于带有“ U”标志的第二条记录,即除“ y_val”列数据外,与之前的记录相同。

master_table

enter image description here

backup_table

预期

enter image description here

但是实际的表数据是

enter image description here

0 个答案:

没有答案