我有一个 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]这是不可取的。
