Skip to main content
 首页 » 编程设计

python之PySpark:如何将具有 SparseVector 类型列的 Spark 数据帧写入 CSV 文件

2024年10月17日31txw1958

我有一个 spark 数据框,其中有一列类型为 spark.mllib.linalg.SparseVector:

1) 如何将其写入 csv 文件?

2) 如何打印所有向量?

请您参考如下方法:

要将数据帧写入 csv 文件,您可以使用标准 df.write.csv(output_path) .

但是,如果您只使用上面的方法,您很可能会得到 java.lang.UnsupportedOperationException: CSV data source does not support struct<type:tinyint,size:int,indices:array<int>,values:array<double>> data type具有 SparseVector 类型的列的错误。

有两种方法可以打印 SparseVector 并避免该错误:稀疏格式或密集格式。

如果想以dence格式打印,可以这样定义udf:

from pyspark.sql.functions import udf 
from pyspark.sql.types import StringType 
from pyspark.sql.functions import col 
 
dense_format_udf = udf(lambda x: ','.join([str(elem) for elem in x], StringType()) 
 
df = df.withColumn('column_name', dense_format_udf(col('column_name'))) 
 
df.write.option("delimiter", "\t").csv(output_path) 

该列以密集格式输出如下内容:1.0,0.0,5.0,0.0

如果你想以稀疏格式打印,你可以使用the OOB __str__ function of the SparseVector class ,或者发挥创意并定义您自己的输出格式。在这里,我将使用 OOB 功能。

from pyspark.sql.functions import udf 
from pyspark.sql.types import StringType 
from pyspark.sql.functions import col 
 
sparse_format_udf = udf(lambda x: str(x), StringType()) 
 
df = df.withColumn('column_name', sparse_format_udf(col('column_name'))) 
 
df.write.option("delimiter", "\t").csv(output_path) 

该列以稀疏格式打印成类似这样的内容 (4,[0,2],[1.0,5.0])

注意我之前尝试过这种方法:df = df.withColumn("column_name", col("column_name").cast("string"))但是该列只是打印成这样的 [0,5,org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@6988050,org.apache.spark.sql.catalyst.expressions.UnsafeArrayData@ec4ae6ab]这是不可取的。