前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住给大家分享一下。点击跳转到网站:https://www.captainai.net/dongkelun
前言
由于Spark机器学习要求输入的DataFrame类型为数值类型,所以如果原始数据读进来的列为string类型,需要一一转化,而如果列很多的情况下一个转化很麻烦,所以能不能一个循环或者一个函数去解决呢。
1、单列转化方法
1 | import org.apache.spark.sql.types._ |
1 | +----+ |
2、循环转变
然后就想能不能用这个方法循环把每一列转成double,但没想到怎么实现,可以用withColumn循环实现。
1 | val colNames = df.columns |
1 | +----+----+----+----+----+ |
3、通过:_*
但是上面这个方法效率比较低,然后问了一下别人,发现scala 有array:_*这样传参这种语法,而df的select方法也支持这样传,于是最终可以按下面的这样写
1 | val cols = colNames.map(f => col(f).cast(DoubleType)) |
1 | +----+----+----+----+----+ |
这样就可以很方便的查询指定多列和转变指定列的类型了:
1 | val name = "col1,col3,col5" |
1 | +----+----+----+ |
附完整代码:
1 | package com.dkl.blog.spark.df |