Python PySpark:如何将具有SparseVector类型列的Spark数据帧写入CSV文件?
我有一个spark数据框,其中一列的类型为spark.mllib.linalg.SparseVector: 1) 如何将其写入csv文件 2) 如何打印所有向量Python PySpark:如何将具有SparseVector类型列的Spark数据帧写入CSV文件?,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我有一个spark数据框,其中一列的类型为spark.mllib.linalg.SparseVector: 1) 如何将其写入csv文件 2) 如何打印所有向量 df2=df1.map(lambda行:row.yourVectorCol) 或df1.map(lambda行:行[1]) 其中,您可以有一个命名列,也可以仅通过该列在行中的位置引用该列 然后,要打印它,您可以df2.collect() 如果没有更多信息,这可能会对您有所帮助,或者对您帮助不够。请详细说明。要将数据帧写入csv文件,可
df2=df1.map(lambda行:row.yourVectorCol)
或df1.map(lambda行:行[1])
其中,您可以有一个命名列,也可以仅通过该列在行中的位置引用该列
然后,要打印它,您可以df2.collect()
如果没有更多信息,这可能会对您有所帮助,或者对您帮助不够。请详细说明。要将数据帧写入csv文件,可以使用标准的
df.write.csv(输出路径)
但是,如果仅使用上面的选项,则可能会得到java.lang.UnsupportedOperationException:CSV数据源不支持SparseVector类型的列的结构数据类型
错误
有两种方法可以打印SparseVector并避免该错误:稀疏格式或密集格式
如果要以稀疏格式打印,可以如下定义自定义项:
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
如果您想以密集格式打印,您可以利用,或者创造性地定义自己的输出格式。这里我将使用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\u name”,col(“column\u name”).cast(“string”)
,但该列只是打印到类似以下内容的[0,5,org.apache.spark.sql.catalyst.expressions。UnsafeArrayData@6988050,org.apache.spark.sql.catalyst.expressions。UnsafeArrayData@ec4ae6ab]
这是不可取的。谢谢,这很有用,但是您没有在udf名称中混淆稀疏和密集吗?也就是说,1.0,0.0,5.0,0.0
应该是稠密格式的自定义项,而(4[0,2],[1.0,5.0])
应该是稀疏格式和稀疏格式的自定义项?