Java 将Spark数据帧写入JSON会丢失MLLIB稀疏向量的格式

Java 将Spark数据帧写入JSON会丢失MLLIB稀疏向量的格式,java,apache-spark,apache-spark-sql,apache-spark-mllib,Java,Apache Spark,Apache Spark Sql,Apache Spark Mllib,我正在为json编写一个(Java)Spark数据帧。其中一列是mllib稀疏向量。稍后,我将json文件读入第二个数据帧,但稀疏向量列现在是WrappedArray,在第二个数据帧中不作为稀疏向量读取。我的问题是:为了得到一个稀疏向量列而不是wrappedArray列,我可以在写端或读端做些什么吗 写作: initialDF.coalesce(1).write().json("initial_dataframe"); 阅读: DataFrame secondDF = hiveContext.

我正在为json编写一个(Java)Spark数据帧。其中一列是mllib稀疏向量。稍后,我将json文件读入第二个数据帧,但稀疏向量列现在是WrappedArray,在第二个数据帧中不作为稀疏向量读取。我的问题是:为了得到一个稀疏向量列而不是wrappedArray列,我可以在写端或读端做些什么吗

写作:

initialDF.coalesce(1).write().json("initial_dataframe");
阅读:

DataFrame secondDF = hiveContext.read().json("initial_dataframe");

答案很简单。为
DataFrameReader提供架构

import org.apache.spark.mllib.linalg.VectorUDT

val path: String = ???
val df = Seq((1L, Vectors.parse("(5, [1.0, 3.0], [2.0, 3.0])"))).toDF
df.write.json(path)

spark.read.json(path).printSchema
// root
//  |-- _1: long (nullable = true)
//  |-- _2: struct (nullable = true)
//  |    |-- indices: array (nullable = true)
//  |    |    |-- element: long (containsNull = true)
//  |    |-- size: long (nullable = true)
//  |    |-- type: long (nullable = true)
//  |    |-- values: array (nullable = true)
//  |    |    |-- element: double (containsNull = true)
当提供正确的模式时

import org.apache.spark.mllib.linalg.VectorUDT
import org.apache.spark.sql.types.{LongType, StructField, StructType}

val schema = StructType(Seq(
  StructField("_1", LongType, true),
  StructField("_2", new VectorUDT, true)))

spark.read.schema(schema).json(path).printSchema
root
 |-- _1: long (nullable = true)
 |-- _2: vector (nullable = true)

spark.read.schema(schema).json(path).show(1)
// +---+-------------------+
// | _1|                 _2|
// +---+-------------------+
// |  1|(5,[1,3],[2.0,3.0])|
// +---+-------------------+
通常,如果您使用的源不提供模式发现机制


如果JSON不是硬需求,那么Parquet将保留向量类型并提供模式发现机制

矢量可序列化吗?矢量内容(大小、索引、值)在生成的文件中写得正确,但没有提到SparseVector或矢量(org.apache.spark.mllib.linalg.vector)扩展该向量并实现您自己的属性,允许它被序列化和反序列化为json。我认为它已经可以序列化了:请参阅。感谢您的回答。因此,我需要提供模式的原因似乎是根据您发送的链接,JSON“不提供模式信息”。我是否可以使用另一种不需要提供模式的格式?i、 是保留模式信息的格式吗?