【发布时间】:2018-10-22 18:35:51
【问题描述】:
我有两个数据框:df1
+---+-----------------+
|id1| items1|
+---+-----------------+
| 0| [B, C, D, E]|
| 1| [E, A, C]|
| 2| [F, A, E, B]|
| 3| [E, G, A]|
| 4| [A, C, E, B, D]|
+---+-----------------+
和df2:
+---+-----------------+
|id2| items2|
+---+-----------------+
|001| [A, C]|
|002| [D]|
|003| [E, A, B]|
|004| [B, D, C]|
|005| [F, B]|
|006| [G, E]|
+---+-----------------+
我想根据items2 中的值创建一个指标向量(在df1 中的新列result_array 中)。向量的长度应与df2 中的行数相同(在此示例中,它应具有 6 个元素)。如果items1 中的行包含items2 对应行中的所有元素,则其元素的值应为1.0,否则为0.0。结果应如下所示:
+---+-----------------+-------------------------+
|id1| items1| result_array|
+---+-----------------+-------------------------+
| 0| [B, C, D, E]|[0.0,1.0,0.0,1.0,0.0,0.0]|
| 1| [E, A, C]|[1.0,0.0,0.0,0.0,0.0,0.0]|
| 2| [F, A, E, B]|[0.0,0.0,1.0,0.0,1.0,0.0]|
| 3| [E, G, A]|[0.0,0.0,0.0,0.0,0.0,1.0]|
| 4| [A, C, E, B, D]|[1.0,1.0,1.0,1.0,0.0,0.0]|
+---+-----------------+-------------------------+
例如,在第 0 行,第二个值为 1.0,因为 [D] 是 [B, C, D, E] 的子集,第四个值为 1.0,因为 [B, D, C] 是[B、C、D、E]。 df2 中的所有其他项目组都不是 [B, C, D, E] 的子集,因此它们的指标值为 0.0。
我尝试使用 collect() 创建 items2 中所有项目组的列表,然后应用 udf,但我的数据太大(超过 1000 万行)。
【问题讨论】: