apache-spark - 如何将具有“valid_from”和“valid_to”列的表连接到具有时间戳的表?
问题描述
我在 PySpark 工作,有一个表格,其中包含特定文章的销售数据,每个日期和文章一行:
#ARTICLES
+-----------+----------+
|timestamp |article_id|
+-----------+----------+
| 2018-01-02| 1111111|
| 2018-01-02| 2222222|
| 2018-01-02| 3333333|
| 2018-01-03| 1111111|
| 2018-01-03| 2222222|
| 2018-01-03| 3333333|
+-----------+----------+
然后,我有一个较小的表,其中包含每篇文章的价格数据。价格从某个日期到另一个日期有效,在最后两列中指定:
#PRICES
+----------+-----+----------+----------+
|article_id|price|from_date |to_date |
+----------+-----+----------+----------+
| 1111111| 8.99|2000-01-01|2999-12-31|
| 2222222| 4.29|2000-01-01|2006-09-05|
| 2222222| 2.29|2006-09-06|2999-12-31|
+----------+-----+----------+----------+
在此处的最后两行中,您会看到此价格已在 2006-09-06 降低。
我现在想将价格加入第一张桌子。它必须是其各自时间戳上的价格。在这个例子中,我想要以下结果:
#RESULT
+-----------+----------+-----+
|timestamp |article_id|price|
+-----------+----------+-----+
| 2018-01-02| 1111111| 8.99|
| 2018-01-02| 2222222| 2.29|
| 2018-01-02| 3333333| null|
| 2018-01-03| 1111111| 8.99|
| 2018-01-03| 2222222| 2.29|
| 2018-01-03| 3333333| null|
+-----------+----------+-----+
我将如何最好地做到这一点?
我的一个想法是“推出”价格表以包含每个时间戳和 article_id 的一行,然后使用这两个键加入。但我不知道如何使用两个日期列展开表格。
解决方案
在条件之间加入应该可以工作。
from pyspark.sql.functions import col
articles.alias('articles').join(prices.alias('prices'),
on=(
(col('articles.article_id') == col('prices.article_id')) &
(col('articles.timestamp').between(col('prices.from_date'), col('prices.to_date')))
),
how='left'
).select('articles.*','prices.price')
推荐阅读
- python - 在 django 中根据基于关系的键、值创建表单
- ios - 如何为分布式应用程序实现非对称加密,其中密钥都可以存储为字符串?
- c++ - 为什么 std::map::emplace 使用会泄漏内存?
- python - Pandas:将摘要信息添加到 groupby 框架中的新列
- python - Selenium IDE 可以工作,但 Python Selenium 不能:可能是 iFrame 问题
- visual-foxpro - Visual foxpro 与选择命令冲突
- java - Jetty WebappContext
- javascript - Node.js 应用程序在运行循环一段时间后停止
- specman - 如何将 32 位数字的每个位与另一个 32 位数字进行比较?
- static-analysis - Fortify AuditWorkbench - 合并审计项目