Spark - 拆分,转换和存储矢量数据到CSV文件

时间:2017-09-06 16:57:48

标签: apache-spark apache-spark-sql

我有一个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文件?

1 个答案:

答案 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

进行操作