2017-09-06 25 views
0

我有一个包含在下面火花 - 分裂,转换和存储矢量数据转换为CSV文件

+--------------------+-----+-----------+ 
|   features|Label|OutputLabel| 
+--------------------+-----+-----------+ 
|(1133,[33,296,107...| 0|  0.0| 
|(1133,[19,1045,10...| 0|  0.0| 
|(1133,[9,398,1075...| 0|  0.0| 
|(1133,[0,927,1074...| 0|  0.0| 
|(1133,[41,223,107...| 0|  0.0| 
|(1133,[70,285,108...| 0|  0.0| 
|(1133,[4,212,1074...| 0|  0.0| 
|(1133,[25,261,107...| 0|  0.0| 
|(1133,[0,258,1074...| 0|  0.0| 
|(1133,[2,219,1074...| 0|  0.0| 
|(1133,[8,720,1074...| 0|  0.0| 
|(1133,[2,260,1074...| 0|  0.0| 
|(1133,[54,348,107...| 0|  0.0| 
|(1133,[167,859,10...| 0|  0.0| 
|(1133,[1,291,1074...| 0|  0.0| 
|(1133,[1,211,1074...| 0|  0.0| 
|(1133,[23,216,107...| 0|  0.0| 
|(1133,[126,209,11...| 0|  0.0| 
|(1133,[70,285,108...| 0|  0.0| 
|(1133,[96,417,107...| 0|  0.0| 
+--------------------+-----+-----------+ 
所示它的列状的第一列中的一个矢量数据的火花数据帧

更新:请参阅模式下面此数据帧的

root 
|-- features: vector (nullable = true) 
|-- Label: integer (nullable = true) 
|-- OutputLabel: double (nullable = true) 

问题1:我需要的第一列的数据拆分为两列,以使整数数据应该来在一列与阵列数据应进来另一列。不知道如何在Spark/Scala中做到这一点?任何指针都会有帮助。

当我试图写这个数据帧以csv文件,我得到了下面的错误

异常线程“main” java.lang.UnsupportedOperationException: CSV数据源不支持 结构,价值观:array> 数据类型。

问题2:我知道,即使这个数据帧不能写成文本文件,因为它会只写一列到输出文件,它不应该是结构类型的。那么是否可以在将第一列分成两个单独的列之后编写此数据框?第二列数据将是数组数据类型。我们可以用这种方式写入输出文件吗?

问题3:我们有可能将数组数据单独写入csv文件吗?

+0

你可以分享你的数据框的模式说明? –

+0

@RameshMaharjan我已经更新了这个问题以获得模式。请检查一下 – JKC

回答

0

那么是否有可能在将第一列分成两个单独的列后写入这个数据帧?

不,您所看到的仅仅是SparseVector的表示形式。即使您提取索引和值,CSV源只支持原子类型。

如果你死心塌地在使用CSV我一整列转换为JSON

import org.apache.spark.ml.linalg.Vectors 
import org.apache.spark.sql.functions._ 

val df = sc.parallelize(Seq(
    (Vectors.sparse(100, Array(1, 11, 42), Array(1, 2, 3)), 0, 0.0) 
)).toDF("features", "label", "outputlabel") 

df.withColumn("features", to_json(struct($"features"))).write.csv(...) 

解析它以Vector遵循provided here