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

时间:2016-10-12 19:35:19

标签: python apache-spark pyspark

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

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

2)如何打印所有载体?

2 个答案:

答案 0 :(得分:1)

  1. https://github.com/databricks/spark-csv
  2. df2 = df1.map(lambda row: row.yourVectorCol)

    df1.map(lambda row: row[1])

    您可以拥有一个命名列,也可以只按行在行中的位置来引用该列。

    然后,打印它,你可以df2.collect()

  3. 如果没有更多信息,这可能对您有所帮助,或者对您没有帮助。请详细说明一下。

答案 1 :(得分:0)

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

但是,如果您只是使用上述内容,则可能会出现具有SparseVector类型的列的java.lang.UnsupportedOperationException: CSV data source does not support struct<type:tinyint,size:int,indices:array<int>,values:array<double>> data type错误。

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

如果要以稀疏格式打印,可以像这样定义udf:

from pyspark.sql.functions import udf
from pyspark.sql.types import StringType
from pyspark.sql.functions import col

sparse_format_udf = udf(lambda x: ','.join([str(elem) for elem in x], StringType())

df = df.withColumn('column_name', sparse_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

dense_format_udf = udf(lambda x: str(x), StringType())

df = df.withColumn('column_name', dense_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]的内容,这是不可取的。