Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark:如何将具有SparseVector类型列的Spark数据帧写入CSV文件?_Python_Apache Spark_Pyspark - Fatal编程技术网

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

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文件,可

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

1) 如何将其写入csv文件

2) 如何打印所有向量

  • 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])
    应该是稀疏格式和稀疏格式的自定义项?