Apache spark 如何在spark流媒体应用中使用滞后/超前功能?
我正在使用spark sql 2.4.x版本,datastax spark cassandra连接器用于cassandra-3.x版本。还有卡夫卡 我有一个来自卡夫卡主题的一些财务数据的场景。 如公司ID、年度、季度、销售、上一次销售数据Apache spark 如何在spark流媒体应用中使用滞后/超前功能?,apache-spark,cassandra,apache-spark-sql,Apache Spark,Cassandra,Apache Spark Sql,我正在使用spark sql 2.4.x版本,datastax spark cassandra连接器用于cassandra-3.x版本。还有卡夫卡 我有一个来自卡夫卡主题的一些财务数据的场景。 如公司ID、年度、季度、销售、上一次销售数据 val kafkaDf = sc.parallelize(Seq((15,2016, 4, 100.5,"")).toDF("companyId", "year","quarter", "sales","prev_sales") 我需要使用卡桑德拉表中的上一
val kafkaDf = sc.parallelize(Seq((15,2016, 4, 100.5,"")).toDF("companyId", "year","quarter", "sales","prev_sales")
我需要使用卡桑德拉表中的上一年同一季度数据预测销售额,如下所示
val cassandraTabledf = sc.parallelize(Seq(
(15,2016, 3, 120.6, 320.6),
(15,2016, 2, 450.2,650.2),
(15,2016, 1, 200.7,700.7),
(15,2015, 4, 221.4,400),
(15,2015, 3, 320.6,300),
(15,2015, 2, 650.2,200),
(15,2015, 1, 700.7,100))).toDF("companyId", "year","quarter", "sales","prev_sales")
i、 e.对于Seq((152016,4100.5,“”)数据,应为2015年第四季度数据,即221.4
因此,新的数据是必要的
(1520164100.5221.4)
如何做到这一点?
我们可以显式地进行查询,但有没有办法在cassandra表上使用join使用“lag”函数?我认为它不需要任何
leg
和lead
函数。您也可以通过join
获得所需的输出。请检查以下代码以供参考:
注意:我在kafkaDF
中添加了更多数据,以便于理解。
scala> kafkaDf.show(false)
+---------+----+-------+-----+----------+
|companyId|year|quarter|sales|prev_sales|
+---------+----+-------+-----+----------+
|15 |2016|4 |100.5| |
|15 |2016|1 |115.8| |
|15 |2016|3 |150.1| |
+---------+----+-------+-----+----------+
scala> cassandraTabledf.show
+---------+----+-------+-----+----------+
|companyId|year|quarter|sales|prev_sales|
+---------+----+-------+-----+----------+
| 15|2016| 3|120.6| 320.6|
| 15|2016| 2|450.2| 650.2|
| 15|2016| 1|200.7| 700.7|
| 15|2015| 4|221.4| 400|
| 15|2015| 3|320.6| 300|
| 15|2015| 2|650.2| 200|
| 15|2015| 1|700.7| 100|
+---------+----+-------+-----+----------+
scala>kafkaDf.alias("k").join(
cassandraTabledf.alias("c"),
col("k.companyId") === col("c.companyId") &&
col("k.quarter") === col("c.quarter") &&
(col("k.year") - 1) === col("c.year"),
"left"
)
.drop("prev_sales")
.select(col("k.*"), col("c.sales").alias("prev_sales"))
.withColumn("prev_sales", when(col("prev_sales").isNull, col("sales")).otherwise(col("prev_sales")))
.show()
+---------+----+-------+-----+----------+
|companyId|year|quarter|sales|prev_sales|
+---------+----+-------+-----+----------+
| 15|2016| 1|115.8| 700.7|
| 15|2016| 3|150.1| 320.6|
| 15|2016| 4|100.5| 221.4|
+---------+----+-------+-----+----------+
对不起,我不熟悉Cassandra Spark驱动程序。任何Spark sql查询都可能出现延迟,AFAIK@BdEngineer,您能否提供详细信息,说明您是如何加入dataframe的?以及为什么它需要leg功能?这里的主要问题是,这是一个Spark连接,而不是仅在必要时才进行优化的连接data@BdEngineer,我已更改加入条件这将处理“如果没有2015年第四季度的记录,则应填充2016年第四季度的“销售额”的场景。请检查并确认由于这一个已关闭,您可以提出有关stackoverflow的新问题,并提供结果数据框和另一个有值的数据框。@b工程师我已回答,请检查