我有一个Spark数据帧,其中包含一个列中的矢量数据,如下面的第一列
+--------------------+-----+-----------+
| 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数据源不支持 结构,值:阵列> 数据类型。
问题2:我知道即使这个数据帧也不能写成文本文件,因为它只会在输出文件中写入一列,而且不应该是Struct类型。在将第一列拆分成两个单独的列之后,是否可以编写此数据帧?第二列数据将是数组数据类型。我们可以这样写入输出文件吗?
问题3:我们是否可以将数组数据单独写入csv文件?
答案 0 :(得分: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