- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试在 Spark 2.4.4 中实现 SCD Type 2 逻辑。我有两个数据框;一个包含“现有数据”,另一个包含“新传入数据”。
下面给出了输入和预期输出。需要发生的是:
所有传入行都应附加到现有数据中。
只有以下 3 行之前处于“Activity ”状态才应变为非 Activity 状态,并填充相应的“endDate”,如下所示:
pk=1, amount = 20 => 该行应变为“非 Activity ”且“endDate”是下一行(Lead)的“startDate”
pk=2, amount = 100 => 该行应变为“非 Activity 状态”且“endDate”是下一行(潜在客户)的“startDate”
pk=3, amount = 750 => 该行应变为“非 Activity 状态”且“endDate”是下一行(潜在客户)的“startDate”
如何在 Spark 中执行此操作?
现有数据:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 10|2019-01-01 12:00:00|2019-01-20 05:00:00| 0|
| 1| 20|2019-01-20 05:00:00| null| 1|
| 2| 100|2019-01-01 00:00:00| null| 1|
| 3| 75|2019-01-01 06:00:00|2019-01-26 08:00:00| 0|
| 3| 750|2019-01-26 08:00:00| null| 1|
| 10| 40|2019-01-01 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
新传入数据:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 50|2019-02-01 07:00:00|2019-02-02 08:00:00| 0|
| 1| 75|2019-02-02 08:00:00| null| 1|
| 2| 200|2019-02-01 05:00:00|2019-02-01 13:00:00| 0|
| 2| 60|2019-02-01 13:00:00|2019-02-01 19:00:00| 0|
| 2| 500|2019-02-01 19:00:00| null| 1|
| 3| 175|2019-02-01 00:00:00| null| 1|
| 4| 50|2019-02-02 12:00:00|2019-02-02 14:00:00| 0|
| 4| 300|2019-02-02 14:00:00| null| 1|
| 5| 500|2019-02-02 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
预期输出:
+---+------+-------------------+-------------------+------+
| pk|amount| startDate| endDate|active|
+---+------+-------------------+-------------------+------+
| 1| 10|2019-01-01 12:00:00|2019-01-20 05:00:00| 0|
| 1| 20|2019-01-20 05:00:00|2019-02-01 07:00:00| 0|
| 1| 50|2019-02-01 07:00:00|2019-02-02 08:00:00| 0|
| 1| 75|2019-02-02 08:00:00| null| 1|
| 2| 100|2019-01-01 00:00:00|2019-02-01 05:00:00| 0|
| 2| 200|2019-02-01 05:00:00|2019-02-01 13:00:00| 0|
| 2| 60|2019-02-01 13:00:00|2019-02-01 19:00:00| 0|
| 2| 500|2019-02-01 19:00:00| null| 1|
| 3| 75|2019-01-01 06:00:00|2019-01-26 08:00:00| 0|
| 3| 750|2019-01-26 08:00:00|2019-02-01 00:00:00| 1|
| 3| 175|2019-02-01 00:00:00| null| 1|
| 4| 50|2019-02-02 12:00:00|2019-02-02 14:00:00| 0|
| 4| 300|2019-02-02 14:00:00| null| 1|
| 5| 500|2019-02-02 00:00:00| null| 1|
| 10| 40|2019-01-01 00:00:00| null| 1|
+---+------+-------------------+-------------------+------+
最佳答案
您可以首先从新 DataFrame 中为每个组 pk
选择第一个 startDate
,然后与旧 DataFrame 合并以更新所需的列。然后,您可以合并所有连接结果和新的 DataFrame。
类似这样的事情:
// get first state by date for each pk group
val w = Window.partitionBy($"pk").orderBy($"startDate")
val updates = df_new.withColumn("rn", row_number.over(w)).filter("rn = 1").select($"pk", $"startDate")
// join with old data and update old values when there is match
val joinOldNew = df_old.join(updates.alias("new"), Seq("pk"), "left")
.withColumn("endDate", when($"endDate".isNull && $"active" === lit(1) && $"new.startDate".isNotNull, $"new.startDate").otherwise($"endDate"))
.withColumn("active", when($"endDate".isNull && $"active" === lit(1) && $"new.startDate".isNotNull, lit(0)).otherwise($"active"))
.drop($"new.startDate")
// union all
val result = joinOldNew.unionAll(df_new)
关于java - 在 Spark 中实现 SCD 类型 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59586700/
在 SSIS 中,如果传入的数据集对同一个业务 key 有多个记录,我如何在不使用 SCD 向导的情况下将其加载到具有 SCD 类型 2 的维度表。 样本数据集 Customer ID Name
我正在尝试使用合并查询在数据构建工具中实现 scd1。但我没有得到在增量模型中编写此查询的确切方法。 谁能告诉我们必须在哪里编写合并查询。 {{ config( materia
在实现时间日期时间对时,哪种方法更好? 方法一 _RK FROM_DTTM TO_DTTM 1 01-JAN-2012 00:00:00 31-DEC-201
如何处理事实表中的 scd type2 更新?我没有在事实表上进行增量加载。任何好的方法都可以遵循。谁能建议我,以便我在将数据加载到事实表时可以采用相同的方法。 ETL(Pentaho) 最佳答案 我
我们有以下数据: 事实表: id | key | name | salary | loaction | start_date 1 | emp_1 | Shubham | 10000 |
假设我们有一个代表销售办事处的维度。办公室可能会搬迁,这将是第二类变化。我们希望跟踪旧办公地点发生的操作以及现在新办公地点发生的操作,并了解更改何时发生。到目前为止,只是标准的II型设计。现在假设一个
我需要生成报告,该报告将每天为 SCD 表显示新/更改的行数。 这是创建表的 SQL: create table #scd( code nvarchar not null , start
这里有点新,但就这样吧。用于填充 Type-3 SCD 的算法是什么?我已经设置了事实表和维度表,并且已经通过 talend 中的 TOS 完成了此操作,但需要代码。使用MySQL。任何类型的一般想法
我在 mssql 服务器中有 2 个表。我可以通过自定义插入/更新/删除以及通过 Merge 语句执行 scd。 Awesome Merge 我想知道是否有任何通用程序可以达到目的。我们只需将 2 个
我在让 JAXB 绑定(bind)文件与 annox 和 SCD 元素选择一起使用时遇到困难。该模式是一个简单的基本模式,具有名为 SongType 的 ComplexType。我尝试了正常的方法做如
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 9 年前。 Improve t
尝试在 Spark 2.4.4 中实现 SCD Type 2 逻辑。我有两个数据框;一个包含“现有数据”,另一个包含“新传入数据”。 下面给出了输入和预期输出。需要发生的是: 所有传入行都应附加到现有
我试图了解 SCD 类型 5,6 和 7 的工作原理。 我读了这个 article金博尔集团和stack overflow回答类型 6。 我可以理解 Type 6 的概念、它是如何工作的以及何时使用它
如何将 .net core 应用程序打包为“框架相关部署 (FDD)”或“自包含部署 (SCD)' 使用 Visual Studio 2017 (IDE) ?我知道如何通过 dotnet CLI/命令
我有这些数据: CREATE TABLE #student ( student_id INT, status VARCHAR(50), created_dt DA
假设您在 CouchDB 中有一个类似日志的文档集合,如 JSON 文档和属性的表格表示(每行是一个 JSON 文档,每列是一个属性): PRODUCT_ID START_DATE PRICE 000
我正在尝试解决如何为我的应用程序创建“日志”并将它们存储到数据库的问题。 假设我有这个数据库结构: 第一个表: weatherstation_id |气象站名称 | weatherstation_ip
我是一名优秀的程序员,十分优秀!