Pyspark - добавить еще один столбец в редкий векторный столбец - PullRequest
0 голосов
/ 02 июля 2018

У меня есть фрейм данных PySpark с одним из столбцов (features), который является разреженным вектором. Например:

+------------------+-----+
|     features     |label|
+------------------+-----+
| (4823,[87],[0.0])|  0.0|
| (4823,[31],[2.0])|  0.0|
|(4823,[159],[0.0])|  1.0|
|  (4823,[1],[7.0])|  0.0|
|(4823,[15],[27.0])|  0.0|
+------------------+-----+

Я хотел бы расширить столбец features и добавить к нему еще одну функцию, например:

+-------------------+-----+
|     features      |label|
+-------------------+-----+
| (4824,[87],[0.0]) |  0.0|
| (4824,[31],[2.0]) |  0.0|
|(4824,[159],[0.0]) |  1.0|
|  (4824,[1],[7.0]) |  0.0|
|(4824,[4824],[7.0])|  0.0|
+-------------------+-----+

Есть ли способ сделать это, не распаковывая SparseVector в плотный, а затем перепаковывая его для разрежения с новым столбцом?

1 Ответ

0 голосов
/ 03 июля 2018

Добавление нового столбца к существующему SparseVector проще всего сделать с помощью преобразователя VectorAssembler в библиотеке ML. Он автоматически объединит столбцы в вектор (DenseVector или SparseVector в зависимости от того, какой из них использует меньше всего памяти). Использование VectorAssembler будет не преобразовывать вектор в DenseVector во время процесса слияния (см. Исходный код ). Может использоваться следующим образом:

df = ...

assembler = VectorAssembler(
    inputCols=["features", "new_col"],
    outputCol="features")

output = assembler.transform(df)

Чтобы просто увеличить размер SparseVector, не добавляя новые значения, просто создайте новый вектор большего размера:

def add_empty_col_(v):
    return SparseVector(v.size + 1, v.indices, v.values)

add_empty_col = udf(add_empty_col_, VectorUDT())
df.withColumn("sparse", add_empty_col(col("features"))
...