我们都很喜欢sql语句,简单好用又熟悉,那么Spark ML很人性化的为我们提供了SQLTransformer类,使得我们能用我们熟悉的SQL来做特征转化。它支持SparkSql中的所有select选择语句,sum(),count(),group by,order by等等都可以用!形如”SELECT …FROM __THIS__”。’__THIS__’代表输入数据的基础表。
SQLTransformer
实现了一种转换,这个转换通过SQl
语句来定义。目前我们仅仅支持的SQL
语法是像SELECT ... FROM __THIS__ ...
的形式。 这里__THIS__
表示输入数据集相关的表。例如,SQLTransformer
支持的语句如下:
SELECT a, a + b AS a_b FROM __THIS__
SELECT a, SQRT(b) AS b_sqrt FROM __THIS__ where a > 5
SELECT a, b, SUM(c) AS c_sum FROM __THIS__ GROUP BY a, b
例子
假设我们拥有下面的DataFrame
,它的列名是id,v1,v2
。
id | v1 | v2
----|-----|-----
0 | 1.0 | 3.0
2 | 2.0 | 5.0
下面是语句SELECT *, (v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__
的输出结果。
id | v1 | v2 | v3 | v4
----|-----|-----|-----|-----
0 | 1.0 | 3.0 | 4.0 | 3.0
2 | 2.0 | 5.0 | 7.0 |10.0
下面是程序调用的例子。
// $example on$ import org.apache.spark.SparkConf import org.apache.spark.ml.feature.SQLTransformer // $example off$ import org.apache.spark.sql.SparkSession object SQLTransformerExample { def main(args: Array[String]) { val sparkConf = new SparkConf(); sparkConf.setMaster("local[*]").setAppName(this.getClass.getSimpleName) val spark = SparkSession .builder .config(sparkConf) .appName("SQLTransformerExample") .getOrCreate() // $example on$ val df = spark.createDataFrame( Seq((0, 1.0, 3.0), (2, 2.0, 5.0))).toDF("id", "v1", "v2") val sqlTrans = new SQLTransformer().setStatement( "SELECT *, (v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__") sqlTrans.transform(df).show() // $example off$ spark.stop() } }
输出结果:
+—+—+—+—+—-+
| id| v1| v2| v3| v4|
+—+—+—+—+—-+
| 0|1.0|3.0|4.0| 3.0|
| 2|2.0|5.0|7.0|10.0|
+—+—+—+—+—-+