文章目录
  1. 1. 生成模型
  2. 2. 解析模型
  3. 3. 参考

最近在将自研算法集成到pyspark生态中,为了降低用户学习成本,计划将接口、最终生成模型都按照pyspark要求来实现,但是在互联网上并没有找到官方的开发指南,所以只能自己一步一步的琢磨,今天就先来看下pyspark最终保存的模型长什么样,后面再全面总结如何融入生态。

生成模型

首先训练一个模型,本文以逻辑回归为例,代码如下

1
2
3
data = [LabeledPoint(0.0, [0.0, 1.0]), LabeledPoint(1.0, [1.0, 0.0]),]
lrm = LogisticRegressionWithSGD.train(sc.parallelize(data), iterations=10)
lrm.save(sc, 'file:///lrm_model')

生成的结果如下,可以看出模型包含2个文件夹,一个是data,一个是metadata,很明显这两个都是parquet格式的文件,data是DF格式的,metadata是文本格式的。

1
2
3
4
5
6
7
8
9
10
11
$ tree lrm_model/
lrm_model/
├── data
│   ├── _SUCCESS
│   └── part-00000-ccd54944-8aed-4ed5-accd-5d854e8f89b9.snappy.parquet
└── metadata
├── _SUCCESS
└── part-00000

2 directories, 4 files

解析模型

尝试用parquet格式读取data下的内容,很显然是DF结构的数据,3个字段,一条记录,主要是逻辑回归的参数。

1
sqlContext.read.parquet('file:///lrm_model/data').show()
1
2
3
4
5
+--------------------+---------+---------+
| weights|intercept|threshold|
+--------------------+---------+---------+
|[0.94797638679085...| 0.0| 0.5|
+--------------------+---------+---------+

再解析metadata下的数据,如果再用parquet去读就会报错,用text()方法可以看到是一段文字,但并没有显示完全。

1
sqlContext.read.text('file:///lrm_model/metadata').show()
1
2
3
4
5
+--------------------+
| value|
+--------------------+
|{"class":"org.apa...|
+--------------------+

由于是文本,所以直接用cat输出文件内容,可以看出是这个模型的元数据文件,包括类名、版本号及输入数据的特征。

1
2
3
$ cat lrm_model/metadata/part-00000
{"class":"org.apache.spark.mllib.classification.LogisticRegressionModel","version":"1.0","numFeatures":2,"numClasses":2}

参考

文章目录
  1. 1. 生成模型
  2. 2. 解析模型
  3. 3. 参考