在数据处理过程中,我们经常需要选择部分数据列参与后续的操作。但在列的选择方法上,我们有多种方式,本节将以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
指定具体的列名,示例代码如下:
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
注意:正则表达式部分需要使用反单引号(“`”)括起来。
选择除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