【问题标题】:writing Spark Dataframe to JSON loses format for MLLIB Sparse Vector将 Spark Dataframe 写入 JSON 会丢失 MLLIB 稀疏向量的格式
【发布时间】:2016-10-16 19:36:42
【问题描述】:

我正在将 (Java) Spark Dataframe 写入 json。其中一列是 mllib 稀疏向量。后来我将 json 文件读入第二个数据帧,但稀疏向量列现在是 WrappedArray,并且在第二个数据帧中没有被读取为稀疏向量。我的问题:为了获得稀疏向量列而不是 WrappedArray 列,我可以在写入端或读取端做些什么吗?

写作:

initialDF.coalesce(1).write().json("initial_dataframe");

阅读:

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

【问题讨论】:

  • 向量是否可序列化?
  • 矢量内容(大小、索引、值)在结果文件中可以看到正确写入,但没有提及 SparseVector 或 Vector (org.apache.spark.mllib.linalg.向量)
  • 扩展向量并实现您自己的属性,使其可以序列化和反序列化为 json。
  • 我认为它已经可以序列化了:见here

标签: java apache-spark apache-spark-sql apache-spark-mllib


【解决方案1】:

答案很简单。为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])|
// +---+-------------------+

一般来说,如果您使用不提供架构发现机制的来源providing schema explicitly is a good idea

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

【讨论】:

  • 欣赏答案。所以看来我需要提供架构的原因是根据您发送的链接,JSON“不提供架构信息”。我可以使用另一种不需要提供架构的格式吗?即保留架构信息的格式?
猜你喜欢
  • 2017-03-26
  • 2016-06-13
  • 2017-01-01
  • 1970-01-01
  • 2019-04-09
  • 2023-03-20
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多