PySpark:如何将行转换为向量?

PySpark:如何将行转换为向量?,pyspark,pyspark-sql,Pyspark,Pyspark Sql,我在一个有三列的数据框架上工作,colA、colB和colC +---+-----+-----+-----+ |id |colA |colB |colC | +---+-----+-----+-----+ | 1 | 5 | 8 | 3 | | 2 | 9 | 7 | 4 | | 3 | 3 | 0 | 6 | | 4 | 1 | 6 | 7 | +---+-----+-----+-----+ 我需要合并colA、colB和colC列,以获得如下

我在一个有三列的数据框架上工作,colA、colB和colC

+---+-----+-----+-----+
|id |colA |colB |colC |
+---+-----+-----+-----+
| 1 |  5  | 8   | 3   |
| 2 |  9  | 7   | 4   |
| 3 |  3  | 0   | 6   |
| 4 |  1  | 6   | 7   |
+---+-----+-----+-----+
我需要合并colA、colB和colC列,以获得如下所示的新数据帧:

+---+--------------+
|id |     colD     |
+---+--------------+
| 1 |  [5, 8, 3]   |
| 2 |  [9, 7, 4]   |
| 3 |  [3, 0, 6]   |
| 4 |  [1, 6, 7]   |
+---+--------------+
这是获取第一个数据帧的pyspark代码:

l=[(1,5,8,3),(2,9,7,4), (3,3,0,6), (4,1,6,7)]
names=["id","colA","colB","colC"]
db=sqlContext.createDataFrame(l,names)
db.show() 
如何将行转换为向量?有人能帮我吗?
谢谢

您可以使用pyspark.ml中的vectorassembler

from pyspark.ml.feature import VectorAssembler
newdb = VectorAssembler(inputCols=["colA", "colB", "colC"], outputCol="colD").transform(db)
newdb.show()
+---+----+----+----+-------------+
| id|colA|colB|colC|         colD|
+---+----+----+----+-------------+
|  1|   5|   8|   3|[5.0,8.0,3.0]|
|  2|   9|   7|   4|[9.0,7.0,4.0]|
|  3|   3|   0|   6|[3.0,0.0,6.0]|
|  4|   1|   6|   7|[1.0,6.0,7.0]|
+---+----+----+----+-------------+
或者,如果需要,可以使用udf进行行合成

from pyspark.sql import functions as F
from pyspark.sql.types import *
udf1 = F.udf(lambda x,y,z : [x,y,z],ArrayType(IntegerType()))
df.select("id",udf1("colA","colB","colC").alias("colD")).show()
+---+---------+
| id|     colD|
+---+---------+
|  1|[5, 8, 3]|
|  2|[9, 7, 4]|
|  3|[3, 0, 6]|
|  4|[1, 6, 7]|
+---+---------+

希望这有帮助

它实际上稍微取决于您想要的
colD
数据类型。如果需要一个
VectorUDT
列,则使用
vectorsassembler
是正确的转换。如果您只想将字段组合成一个数组,那么就不需要UDF。您可以使用内置的
array
函数组合列:

>>> from pyspark.sql.functions import array
>>> db.select('id',array('colA','colB','colC').alias('colD')).show()

+---+---------+
| id|     colD|
+---+---------+
|  1|[5, 8, 3]|
|  2|[9, 7, 4]|
|  3|[3, 0, 6]|
|  4|[1, 6, 7]|
+---+---------+

与其他转换相比,这实际上会提高性能,因为pyspark不必序列化您的udf

嗨,我也在尝试做同样的事情,但问题是我有262143列。我想把这3行转换成向量。我尝试了这个cols=[c for c in centers\u df.columns],然后test=centers\u df.select(array(cols.alias('colD')),但这需要很长时间。我在databricks上运行这个程序。我不确定您想做什么,但我建议您转换数据,这样您就有262143行和3列。当有相对较少的列和一堆行时,Spark通常工作得更好。我建议您发布一个问题,以便您可以对您的问题进行更详细的描述。谢谢您的建议,我将尝试一下:)