Crear una matriz de indicadores basada en los valores de columna de otro marco de datos en PySpark
Tengo dos marcos de datos: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]|
+---+-----------------+
ydf2
:
+---+-----------------+
|id2| items2|
+---+-----------------+
|001| [A, C]|
|002| [D]|
|003| [E, A, B]|
|004| [B, D, C]|
|005| [F, B]|
|006| [G, E]|
+---+-----------------+
Me gustaría crear un vector indicador (en una nueva columnaresult_array
indf1
) basado en valores enitems2
. El vector debe tener la misma longitud que el número de filas endf2
(en este ejemplo debería tener 6 elementos). Sus elementos deben tener un valor de 1.0 si la fila enitems1
contiene todos los elementos en la fila correspondiente deitems2
, o valor 0.0 de lo contrario. El resultado debería tener el siguiente aspecto:
+---+-----------------+-------------------------+
|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]|
+---+-----------------+-------------------------+
Por ejemplo, en la fila 0, el segundo valor es 1.0 porque [D] es un subconjunto de [B, C, D, E] y el cuarto valor es 1.0 porque [B, D, C] es un subconjunto de [B , C, D, E]. Todos los demás grupos de elementos endf2
no son subconjuntos de [B, C, D, E], por lo tanto, sus valores de indicador son 0.0.
Intenté crear una lista de todos los grupos de elementos enitems2
usando collect () y luego aplico un udf pero mis datos son demasiado grandes (más de 10 millones de filas).