python - PySpark - 稀疏向量列到矩阵

标签 python pyspark apache-spark-sql

我对使用 PySpark 还很陌生。我的 PySpark 数据框中有一列 SparseVectors。

rescaledData.select('features').show(5,False)
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|features                                                                                                                                                            |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|(262144,[43953,62425,66522,148962,174441,249180],[3.9219733362813143,3.9219733362813143,1.213923135179104,3.9219733362813143,3.9219733362813143,0.5720692490067093])|
|(262144,[57925,66522,90939,249180],[3.5165082281731497,1.213923135179104,3.9219733362813143,0.5720692490067093])                                                    |
|(262144,[23366,45531,73408,211290],[2.6692103677859462,3.005682604407159,3.5165082281731497,3.228826155721369])                                                     |
|(262144,[30913,81939,99546,137643,162885,249180],[3.228826155721369,3.9219733362813143,3.005682604407159,3.005682604407159,3.228826155721369,1.1441384980134186])   |
|(262144,[108134,152329,249180],[3.9219733362813143,2.6692103677859462,2.8603462450335466])                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+

我需要将上述数据帧转换为矩阵,其中矩阵中的每一行都对应于数据帧中该行中的一个 SparseVector。

例如,

+-----------------+
|features         |
+-----------------+
|(7,[1,2],[45,63])|
|(7,[3,5],[85,69])|
|(7,[1,2],[89,56])|
+-----------------+

必须转换为

[[0,45,63,0,0,0,0]
[0,0,0,85,0,69,0]
[0,89,56,0,0,0,0]]

我已经阅读了下面的链接,它表明有一个函数 toArray() 完全符合我的要求。 https://mingchen0919.github.io/learning-apache-spark/pyspark-vectors.html

但是,我在使用它时遇到了问题。

vector_udf = udf(lambda vector: vector.toArray())
rescaledData.withColumn('features_', vector_udf(rescaledData.features)).first()

我需要它将每一行转换为数组,然后将 PySpark 数据帧转换为矩阵。

最佳答案

toArray() 将返回 numpy 数组。我们可以转换为列表,然后收集数据框。

from pyspark.sql.types import *
vector_udf = udf(lambda vector: vector.toArray().tolist(),ArrayType(DoubleType()))

df.show() ## my sample dataframe
+-------------------+
|           features|
+-------------------+
|(4,[1,3],[3.0,4.0])|
|(4,[1,3],[3.0,4.0])|
|(4,[1,3],[3.0,4.0])|
+-------------------+

colvalues = df.select(vector_udf('features').alias('features')).collect()

list(map(lambda x:x.features,colvalues))
[[0.0, 3.0, 0.0, 4.0], [0.0, 3.0, 0.0, 4.0], [0.0, 3.0, 0.0, 4.0]]

关于python - PySpark - 稀疏向量列到矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47671546/

相关文章:

apache-spark - Spark Dataframe 验证 Parquet 写入的列名

java - 用于激发 StructType 的 Avro Schema

scala - 如何过滤 Spark Dataframe 的 MapType 字段?

scala - 为什么 Spark SQL 将 String "null"转换为 Float/Double 类型的 Object null?

python - 收到 KeyError : '0_0' for my python program

python - Pandas:按条件删除每组的行

python - 在访问表中使用 Unicode 值并连接标签表达式

python - Pandas 爆炸 - 无法从重复的轴重新索引

apache-spark - Spark 流

hadoop - pyspark.sql.utils.IllegalArgumentException : u"Error while instantiating 'org.apache.spark.sql.hive.HiveSession StateBuilder' :"