Преобразовать векторный тип в двойной тип в pyspark - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть следующий искровой фрейм данных:

+--------------------+--------------------+
|                  f1|                  f2|
+--------------------+--------------------+
| [380.1792652309408]|[-91793.40296983652]|
|[-18662.02751719936]|[-99674.18149372772]|
|[-736.5125444921572]| [-23736.3626879109]|
|[-143436.24812848...|[-136748.6250801389]|
|[-10325.057466551...|[-108747.85455021...|
|[-9771.868356757912]|[-164454.02688403...|

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

Пример вывода:

+--------------------+--------------------+
|                  f1|                  f2|
+--------------------+--------------------+
| 380.1792652309408|-91793.40296983652|
|-18662.02751719936|-99674.18149372772|
|-736.5125444921572| -23736.3626879109|
|-143436.24812848...|-136748.6250801389|
|-10325.057466551...|-108747.85455021...|
|-9771.868356757912|-164454.02688403...|

1 Ответ

1 голос
/ 03 апреля 2020

Обновлен ответ. Улучшение в исходном ответе, поскольку я не использовал Row.

С вынужденным временем простоя, выполняя некоторые утилиты для паркинга и машинного обучения на заднем плане. Здесь идет акцент на Vector с количеством элементов> 1 и одинаковым количеством элементов во всех строках, что будет иметь смысл. И переименование cols.

Вы можете использовать этот пример сейчас:

%python
from pyspark.ml.linalg import Vectors
from pyspark.sql import Row

source_data = [
    Row(city="AMS", temps=Vectors.dense([-1.0, -2.0, -3.0])),
    Row(city="BRU", temps=Vectors.dense([-7.0, -7.0, -5.0])),
              ]
df = spark.createDataFrame(source_data)

def convertToCols(row):
    return ( tuple(row.temps.toArray().tolist()))

df2 = df.rdd.map(convertToCols).toDF(["C1"]) 
df3 = df2.toDF(*(c.replace('_', 'C') for c in df2.columns)) 
df3.show()

возвращает:

+----+----+----+
|  C1|  C2|  C3|
+----+----+----+
|-1.0|-2.0|-3.0|
|-7.0|-7.0|-5.0|
+----+----+----+

В моем примере важно использовать Row, поскольку он создавал DF in-line.

...