У меня есть DataFrame
с двумя колонками:pyspark: объединить ряды DataFrame в DenseVector
df = sqlContext.createDataFrame([
(1, 'a'), (2, 'a'),
(3, 'b'), (4, 'b'),
(5, 'c'), (6, 'c'),
(7, 'd'), (8, 'd'),
], schema=['value', 'name'])
Редактировать 2017/01/13: Я получаю эту dataframe из таблицы SQL на основе Entity-Attribute-Value модель. Таким образом, для каждой строки будет доступен дополнительный третий столбец «id».
Я хочу превратить его в «функции» DataFrame
, как того требуют классификаторы пакета ml
. Для отдельных столбцов это может быть достигнуто с помощью VectorAssembler
:
from pyspark.ml.feature import VectorAssembler
assembler = VectorAssembler(inputCols=['value'], outputCol="features")
selected_features = assembler.transform(df).select('features')
selected_features.collect()
[Row(features=DenseVector([1.0])),
Row(features=DenseVector([2.0])),
Row(features=DenseVector([3.0])),
Row(features=DenseVector([4.0])),
Row(features=DenseVector([5.0])),
Row(features=DenseVector([6.0])),
Row(features=DenseVector([7.0])),
Row(features=DenseVector([8.0]))]
То, что я хочу это:
[Row(features=DenseVector([1.0, 2.0])),
Row(features=DenseVector([3.0, 4.0])),
Row(features=DenseVector([5.0, 6.0])),
Row(features=DenseVector([7.0, 8.0]))]
Что бы наиболее эффективный способ объединения значений столбца value
в DenseVector
на основе значения столбца name
?
Я думал, например, из пользовательской функции агрегации для GroupedData, который будет работать с groupby
:
df.groupby('name').vector_agg().collect()
аналогична функции PostgreSQL array_agg:
SELECT array_agg(df.value) FROM table as df
GROUP BY df.name;
Вы правы!Проблема была связана с обработкой таблицы SQL на основе модели Entity-Attribute-Value. Таким образом, будет третий столбец объекта. Я уточню вопрос соответствующим образом. – mdh
'collect_list' - это то, что я искал – mdh