分布式机器学习:如何快速从Python栈过渡到Scala栈 (4)

我感觉吧,Windows搞环境确实问题更多,以前搞Python、Anaconda那些也是,老是缺这个少那个的,报错信息还看不出来。。。。这方面还是Ubuntu更靠谱一点。。。。

pyspark到Scala Spark

代码移植的过程相信大家都有很多经验,关键在于小步前进,千万别为了图快从头到尾搞完再运行,后面调起来更要命,把项目按功能模块划分,机器学习的项目基本还是比较简单的线性结构,我这里主要划分为以下几部分分别进行:

Spark初始化以及数据加载;

数据预处理;

外部数据处理与链接;

特征工程;

建模;

可以看到基本以机器学习的各个环节为划分依据,方便出行问题进行debug,以我的经验主要工作在特征工程部份,这部分两边的差异会比较大,而且处理起来要格外小心,避免因为逻辑bug导致最终结果不一致;

Spark初始化以及数据加载

这部分最简单,因为除了语法差异,可以说是完全一致,注意点如下:

由于Idea开发Spark默认没有启动Hadoop的,因此对应数据都在本地;

字符串如果用的是单引号需要全部替换为双引号;

两边的API名基本都没变,Scala更常用的是链式调用,Python用的更多是显式指定参数的函数调用;

外部数据

这里有一个很大的问题,如果你的数据中的列名有中文,那么建议全部重命名为英文,否在在构建SQL表达式等地方会报错,奇怪的是这部分在Python中倒是正常的,这个坑也填了好久。。。。

对于udf的使用上,区别主要在于Scala与Python的函数定义以及Python中对Lambda的使用,官方建议是少用udf,最好在functions包里找找先;

特征工程

我在这部分花的时间比较多,主要是它涉及很多udf、列表推导式、SQL表达式、特征复杂处理等,需要注意:

对于udf部分,Scala中的入参指定类型这一点花了我不少时间,Python用多了就是惯坏了。。。

列表推导式可以由Scala的for (....) yield ....来替换,注意to和until的区别;

表达式部分千万千万不要用中文,都是泪啊,我是因为之前数据集中有一部分列是外部数据,用的中文,天坑。。。。

建模

这部分本身倒是没什么问题,但是我这部分最后会将结果写入到本地的parquet文件,以及保存模型文件,结果一直报错,错误信息也看不出具体原因,按常理来说我首先考虑是权限问题,折腾半天不行,又考虑是API用法问题,各种参数、用法都试了还是不行,最后发现又是windows的问题,缺了一些dll,哎哎,不说了,如果大家也遇到了ExitCodeException exitCode=-1073741515,那么不用怀疑,直接到这里下载程序安装dll即可;

最后

以上就是全部过渡过程,中间有一些波折,但是整体还算顺利,总时间大概是2.5个工作日,希望这篇文章可以加快有同样需求的小伙伴的速度哈,目前感觉上Python要更简洁,Scala更像Java,不过它多了一些可以简化代码的语法糖、高级特性等,期待后面更深入的学习;

也要特别感谢网上大佬们的总结分享,有些问题真心难搞。。。。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfsz.html