Alink教程(Java版)
该文档涉及的组件

第7.6节 数据列的选择


在数据处理过程中,我们经常需要选择部分数据列参与后续的操作。但在列的选择方法上,我们有多种方式,本节将以iris数据集为例进行演示。

读取数据并输入Schema信息的代码如下:

BatchOperator<?> source =
	new CsvSourceBatchOp()
		.setFilePath(DATA_DIR + ORIGIN_FILE)
		.setSchemaStr(SCHEMA_STRING)
		.firstN(2);

System.out.println(source.getSchema());


显示数据的Schema信息如下,

root
 |-- sepal_length: DOUBLE
 |-- sepal_width: DOUBLE
 |-- petal_length: DOUBLE
 |-- petal_width: DOUBLE
 |-- category: STRING



7.6.1 常规选择


指定具体的列名,示例代码如下:

source.select("sepal_length, sepal_width").lazyPrint();

运行结果为:

sepal_length|sepal_width
------------|-----------
5.1000|3.5000
4.9000|3.0000


选择全部数据列,需要使用字符“*”,示例代码如下:

source.select("*").lazyPrint();

运行结果为:

sepal_length|sepal_width|petal_length|petal_width|category
------------|-----------|------------|-----------|--------
5.1000|3.5000|1.4000|0.2000|Iris-setosa
4.9000|3.0000|1.4000|0.2000|Iris-setosa



7.6.2 使用正则过滤列名

注意:正则表达式部分需要使用反单引号(“`”)括起来。

选择除category列之外的其它列,示例代码如下:

source.select("`(category)?+.+`").lazyPrint();

运行结果为:

sepal_length|sepal_width|petal_length|petal_width
------------|-----------|------------|-----------
5.1000|3.5000|1.4000|0.2000
4.9000|3.0000|1.4000|0.2000


选择除sepal_length列与sepal_width列之外的其它列,示例代码如下:

source.select("`(sepal_length|sepal_width)?+.+`").lazyPrint();

运行结果为:

petal_length|petal_width|category
------------|-----------|--------
1.4000|0.2000|Iris-setosa
1.4000|0.2000|Iris-setosa


选择的列名只能为sepal_length或sepal_width,示例代码如下:

source.select("`(sepal_length|sepal_width)?`").lazyPrint();

运行结果为:

sepal_length|sepal_width
------------|-----------
5.1000|3.5000
4.9000|3.0000


选择的列名要以sepal开头,示例代码如下:

source.select("`sepal.+`").lazyPrint();

运行结果为:

sepal_length|sepal_width
------------|-----------
5.1000|3.5000
4.9000|3.0000


选择的列名要以width结尾,示例代码如下:

source.select("`.+width`").lazyPrint();

运行结果为:

sepal_width|petal_width
-----------|-----------
3.5000|0.2000
3.0000|0.2000


使用正则表达式选择全部列,示例代码如下:

source.select("`.*`").lazyPrint();

运行结果为:

sepal_length|sepal_width|petal_length|petal_width|category
------------|-----------|------------|-----------|--------
5.1000|3.5000|1.4000|0.2000|Iris-setosa
4.9000|3.0000|1.4000|0.2000|Iris-setosa


正则过滤可以与常规的选择混合使用,示例代码如下:

source.select("category, `(sepal_length|sepal_width)?`").lazyPrint();

运行结果为:

category|sepal_length|sepal_width
--------|------------|-----------
Iris-setosa|5.1000|3.5000
Iris-setosa|4.9000|3.0000