【发布时间】:2018-07-13 06:03:50
【问题描述】:
我有以下数据集并使用 PySpark
df = sparkSession.createDataFrame([(5, 'Samsung', '2018-02-23'),
(8, 'Apple', '2018-02-22'),
(5, 'Sony', '2018-02-21'),
(5, 'Samsung', '2018-02-20'),
(8, 'LG', '2018-02-20')],
['ID', 'Product', 'Date']
)
+---+-------+----------+
| ID|Product| Date|
+---+-------+----------+
| 5|Samsung|2018-02-23|
| 8| Apple|2018-02-22|
| 5| Sony|2018-02-21|
| 5|Samsung|2018-02-20|
| 8| LG|2018-02-20|
+---+-------+----------+
# Each ID will appear ALWAYS at least 2 times (do not consider the case of unique IDs in this df)
每个 ID 仅在代表较高频率时才应增加 PRODUCT 计数器。 如果频率相同,则应以最近的日期决定哪个产品获得 +1。
从上面的示例中,所需的输出将是:
+-------+-------+
|Product|Counter|
+-------+-------+
|Samsung| 1|
| Apple| 1|
| Sony| 0|
| LG| 0|
+-------+-------+
# Samsung - 1 (preferred twice by ID=5)
# Apple - 1 (preferred by ID=8 more recently than LG)
# Sony - 0 (because ID=5 preferred Samsung 2 time, and Sony only 1)
# LG - 0 (because ID=8 preferred Apple more recently)
使用 PySpark 实现这一结果的最有效方法是什么?
【问题讨论】:
-
如果产品是最新的并且只有一次首选,那么输出应该是什么。另一种情况是该产品多次受到青睐但最近不太受欢迎?
-
Samsung 为 1,因为 ID 只能将 +1 分配给一种产品,即与最高频率(或在相同频率的情况下,最近日期)相关联的产品
-
如果给定的 ID 只有一条记录,则不必考虑。在这里,我只处理不唯一的 ID
标签: python apache-spark pyspark