我有一个spark数据框,其中有一列类型为spark.mllib.linalg.SparseVector:
1)如何将其写入csv文件?
2)如何打印所有载体?
答案 0 :(得分:1)
df2 = df1.map(lambda row: row.yourVectorCol)
或df1.map(lambda row: row[1])
您可以拥有一个命名列,也可以只按行在行中的位置来引用该列。
然后,打印它,你可以df2.collect()
如果没有更多信息,这可能对您有所帮助,或者对您没有帮助。请详细说明一下。
答案 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]
的内容,这是不可取的。