Pyspark анализ правил ассоциации: как перевести фрейм данных в формат, подходящий для частого анализа шаблонов?

#apache-spark #pyspark #associations #fpgrowth

#apache-spark #pyspark #ассоциации #fpgrowth

Вопрос:

Я пытаюсь использовать pyspark для анализа правил ассоциации. Допустим, мои данные похожи:

 myItems=spark.createDataFrame([(1,'a'),
                               (1,'b'),
                               (1,'d'),
                               (1,'c'),
                               (2,'a'),
                               (2,'c'),],
                              ['id','item']) 
  

Но согласно https://spark.apache.org/docs/2.2.0/ml-frequent-pattern-mining.html формат должен быть:

 df = spark.createDataFrame([(1, ['a', 'b', 'd','c']),
                            (2, ['a', 'c'])], 
                           ["id", "items"])
  

Итак, мне нужно перенести мои данные из вертикального положения в горизонтальное, и длины для всех идентификаторов разные.

Как я могу выполнить эту передачу, или есть другой способ сделать это?

Ответ №1:

Пусть ваше исходное определение myItems будет действительным. collect_list будет полезно после того, как вы обычно group обрабатываете фрейм данных по идентификатору.

 >>> myItems=spark.createDataFrame([(1,'a'),
...                                (1,'b'),
...                                (1,'d'),
...                                (1,'c'),
...                                (2,'a'),
...                                (2,'c'),],
...                               ['id','item'])
>>> from pyspark.sql.functions import collect_list
>>> myItems.groupBy(myItems.id).agg(collect_list('item')).show()
 --- ------------------ 
| id|collect_list(item)|
 --- ------------------ 
|  1|      [a, b, d, c]|
|  2|            [a, c]|
 --- ------------------