Как извлечь поплавки из векторных столбцов в PySpark? - PullRequest
0 голосов
/ 18 февраля 2020

My Spark DataFrame содержит данные в следующем формате:

to

printSchema() показывает, что каждый столбец имеет тип vector.

Я пытался получить значения из [ и ], используя приведенный ниже код (для 1 столбца col1):

from pyspark.sql.functions import udf
from pyspark.sql.types import FloatType

firstelement=udf(lambda v:float(v[0]),FloatType())
df.select(firstelement('col1')).show()

Однако как я могу его применить ко всем столбцам df?

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

1. Извлечение первого элемента одного векторного столбца:

Чтобы получить первый элемент векторного столбца, вы можете использовать ответ из этой SO: обсуждение Доступ к элементу вектора в Spark DataFrame (Logisti c Вектор вероятности регрессии)

Вот воспроизводимый пример:

>>> from pyspark.sql import functions as f
>>> from pyspark.sql.types import FloatType
>>> df = spark.createDataFrame([{"col1": [0.2], "col2": [0.25]},
                                {"col1": [0.45], "col2":[0.85]}])
>>> df.show()
+------+------+
|  col1|  col2|
+------+------+
| [0.2]|[0.25]|
|[0.45]|[0.85]|
+------+------+

>>> firstelement=f.udf(lambda v:float(v[0]),FloatType())
>>> df.withColumn("col1", firstelement("col1")).show()
+----+------+
|col1|  col2|
+----+------+
| 0.2|[0.25]|
|0.45|[0.85]|
+----+------+

2. Извлеките первый элемент из нескольких векторных столбцов:

Чтобы обобщить приведенное выше решение для нескольких столбцов, примените for loop. Вот пример:

>>> from pyspark.sql import functions as f
>>> from pyspark.sql.types import FloatType

>>> df = spark.createDataFrame([{"col1": [0.2], "col2": [0.25]},
                                {"col1": [0.45], "col2":[0.85]}])
>>> df.show()
+------+------+
|  col1|  col2|
+------+------+
| [0.2]|[0.25]|
|[0.45]|[0.85]|
+------+------+

>>> firstelement=f.udf(lambda v:float(v[0]),FloatType())
>>> df = df.select([firstelement(c).alias(c) for c in df.columns])
>>> df.show()
+----+----+
|col1|col2|
+----+----+
| 0.2|0.25|
|0.45|0.85|
+----+----+
0 голосов
/ 19 февраля 2020

Насколько я понимаю, вам не нужно использовать UDF для изменения Vector на обычный тип с плавающей точкой. Используйте для нее pyspark предопределенную функцию concat_ws.

>>> from pyspark.sql.functions import *
>>> df.show()
+------+
|   num|
+------+
| [211]|
|[3412]|
| [121]|
| [121]|
|  [34]|
|[1441]|
+------+

>>> df.printSchema()
root
 |-- num: array (nullable = true)
 |    |-- element: string (containsNull = true)

>>> df.withColumn("num", concat_ws("", col("num"))).show()
+----+
| num|
+----+
| 211|
|3412|
| 121|
| 121|
|  34|
|1441|
+----+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...