跨语言(python 到 scala)稀疏数据 ser/deser?

Posted

技术标签:

【中文标题】跨语言(python 到 scala)稀疏数据 ser/deser?【英文标题】:Cross-language (python to scala) sparse data ser/deser? 【发布时间】:2016-03-29 19:23:04 【问题描述】:

我正在开发一个应用程序,我需要在 python 端表示/构造稀疏数据,将数据输出到存储,然后加载到 spark/scala 应用程序中。

关于我应该使用什么格式/库进行序列化/反序列化有什么建议吗?

【问题讨论】:

有没有一种标准的方法可以用支持库(除了推出我自己的库)在 json 中保存稀疏向量?目前我正在考虑使用 spark mllib 稀疏向量,但需要验证序列化格式。 【参考方案1】:

嗯,mllib.Vectors 已经提供了有意义的字符串表示和fromString 方法:

from pyspark.mllib.linalg import Vectors, SparseVector

v = SparseVector(5, [0, 3], [1.0, -1.0])
str(v)

## '(5,[0,3],[1.0,-1.0])'

assert Vectors.parse(str(v)) == v
import org.apache.spark.mllib.linalg.Vectors, Vector

Vectors.parse("(5,[0,3],[1.0,-1.0])")
// org.apache.spark.mllib.linalg.Vector = (5,[0,3],[1.0,-1.0])

如果您想避免使用纯文本,那么 Parquet 是另一种开箱即用的选项:

(sc.parallelize([(SparseVector(5, [0, 3], [1.0, -1.0]), )])
  .toDF()
  .write
  .parquet("/tmp/foo"))
val df = sqlContext.read.parquet("/tmp/foo")
df.printSchema()
// root
// |-- _1: vector (nullable = true)

【讨论】:

以上是关于跨语言(python 到 scala)稀疏数据 ser/deser?的主要内容,如果未能解决你的问题,请参考以下文章

大型稀疏矩阵,带火花的 svd,python

如何从 Scala 中的 DataFrame 在 Spark 中创建分布式稀疏矩阵

Spark常用的算子以及Scala函数总结

scala 稀疏向量

Scala VS Python:为大数据项目选择哪一个

在 Databricks 中将字符串从 SCALA 传递到 Python