参数说明
Alink
通过 Java
调用 com.alibaba.alink.operator.batch.source.CsvSourceBatchOp
类,去读取 CSV
文件,并且支持从本地、HDFS
、http
读取。
主要参数为:
名称 | 中文名称 | 描述 | 类型 | 是否必须? | 取值范围 | 默认值 |
---|---|---|---|---|---|---|
filePath | 文件路径 | 文件路径 | String | ✓ | ||
schemaStr | Schema | Schema 。格式为 colname coltype[, colname2, coltype2[, …]] ,例如 f0 string, f1 bigint, f2 double | String | ✓ | ||
fieldDelimiter | 字段分隔符 | 字段分隔符 | String | “,” | ||
handleInvalidMethod | 处理无效值的方法 | 处理无效值的方法,可取 error , skip | String | ERROR , SKIP | ERROR | |
ignoreFirstLine | 是否忽略第一行数据 | 是否忽略第一行数据 | Boolean | false | ||
lenient | 是否容错 | 若为 true ,当解析失败时丢弃该数据;若为 false ,解析失败是抛异常 | Boolean | false | ||
quoteChar | 引号字符 | 引号字符 | Character | “”” | ||
rowDelimiter | 行分隔符 | 行分隔符 | String | \n | ||
skipBlankLine | 是否忽略空行 | 是否忽略空行 | Boolean | true |
支持的字段类型
字段类型 | 描述 | 值域 | Flink 类型 | Java 类型 |
---|---|---|---|---|
VARCHAR /STRING | 可变长度字符串 | 最大容量为 4 mb | Types.STRING | java.lang.String |
BOOLEAN | 逻辑值 | 值:TRUE ,FALSE ,UNKNOWN | Types.BOOLEAN | java.lang.Boolean |
TINYINT | 微整型,1 字节整数 | 范围是 -128 到 127 | Types.BYTE | java.lang.Byte |
SMALLINT | 短整型,2 字节整数 | 范围为 -32768 至 32767 | Types.SHORT | java.lang.Short |
INT | 整型,4 字节整数 | 范围是 -2147483648 到 2147483647 | Types.INT | java.lang.Integer |
BIGINT /LONG | 长整型,8 字节整数 | 范围是 -9223372036854775808 至 9223372036854775807 | Types.LONG | java.lang.Long |
FLOAT | 4 字节浮点数 | 6 位数字精度 | Types.FLOAT | java.lang.Float |
DOUBLE | 8 字节浮点数 | 15 位十进制精度 | Types.DOUBLE | java.lang.Double |
DECIMAL | 小数类型 | 示例:123.45 是 DECIMAL(5,2) 值 | Types.DECIMAL | java.math.BigDecimal |
DATE | 日期 | 示例:1969-07-20 | Types.SQL_DATE | java.sql.Date |
TIME | 时间 | 示例:20:17:40 | Types.SQL_TIME | java.sql.Time |
TIMESTAMP | 时间戳,日期和时间 | 示例:1969-07-20 20:17:40 | Types.SQL_TIMESTAMP | java.sql.Timestamp |
关于分隔符的说明
Web
前端支持用户输入如下转义字符和 unicode
字符作为分割符:
输入分隔符 | 含义 |
---|---|
\t | 制表符 ( tab 键) |
\n | 换行符 |
\b | 退格符 |
\r | 回车 |
\f | 换页 |
\ | 反斜线字符 |
’ | 单引号 |
" | 双引号 |
\ddd | 1 到 3 位八进制数所代表的任意字符,例如 \001 表示’ctrl + A’,\40 表示空格符 |
\udddd | 1 到 4 位十六进制数所代表的 unicode 字符,例如 \u0001 表示’ctrl + A’,\u0020 表示空格符 |
代码示例
从本地路径读取 CSV
数据
import com.alibaba.alink.operator.batch.BatchOperator;
import com.alibaba.alink.operator.batch.source.CsvSourceBatchOp;
public class test1 {
public static void main(String[] args) throws Exception {
// 设置文件路径
String data_path = "E:\\Alink_study\\src\\main\\resources\\iris.data.csv";
// 设置数据各字段的名称和类型
String SCHEMA_STR = "sepal_length double, sepal_width double, petal_length double, petal_width double, category string";
// 创建批处理对象
BatchOperator data = new CsvSourceBatchOp()
.setFilePath(data_path)
.setSchemaStr(SCHEMA_STR);
// 打印前 5 行数据
data.firstN(5).print();
}
}
CSV
文件中的部分数据为:
5.1,3.5,1.4,0.2,Iris-setosa
4.9,3.0,1.4,0.2,Iris-setosa
4.7,3.2,1.3,0.2,Iris-setosa
4.6,3.1,1.5,0.2,Iris-setosa
5.0,3.6,1.4,0.2,Iris-setosa
5.4,3.9,1.7,0.4,Iris-setosa
4.6,3.4,1.4,0.3,Iris-setosa
........
IEDA
输出为:
从网络中获取数据和 HDFS 中读取数据,需要将 data_path
,的路径换成对应的 URL
。
更复杂的例子
一份葡萄酒相关的数据集:
"fixed acidity";"volatile acidity";"citric acid";"residual sugar";"chlorides";"free sulfur dioxide";"total sulfur dioxide";"density";"pH";"sulphates";"alcohol";"quality"
7;0.27;0.36;20.7;0.045;45;170;1.001;3;0.45;8.8;6
6.3;0.3;0.34;1.6;0.049;14;132;0.994;3.3;0.49;9.5;6
8.1;0.28;0.4;6.9;0.05;30;97;0.9951;3.26;0.44;10.1;6
......
第一行为数据列名的说明,第二行开始是数据,可以看到都是数值类型,各个数之间用分号“;”进行分隔。
我们可以通过设置参数 ignoreFirstLine为True
,略过第一行;并且可以设置字段分隔符参数 fieldDelimiter
为分号“;”。
另外,由于列名不能包含空格,所以由文件第一列转化来的列名需要进行相应处理,这里我们将其写为驼峰形式;并加上数据类型,这里都是 double
类型,构成了数据集的 SchemaStr
。具体的代码如下:
import com.alibaba.alink.operator.batch.BatchOperator;
import com.alibaba.alink.operator.batch.source.CsvSourceBatchOp;
public class test2 {
public static void main(String[] args) throws Exception {
// 设置文件路径
String data_path = "E:\\Alink_study\\src\\main\\resources\\winequality-white.csv";
// 设置数据各字段的名称和类型
String SCHEMA_STR = "fixedAcidity double,volatileAcidity double,citricAcid double,residualSugar double,chlorides double,freeSulfurDioxide double,totalSulfurDioxide double,density double,pH double,sulphates double,alcohol double,quality double";
// 创建批处理对象
BatchOperator data = new CsvSourceBatchOp()
// 设置文件路径
.setFilePath(data_path)
// 设置字段
.setSchemaStr(SCHEMA_STR)
// 设置分隔符
.setFieldDelimiter(";")
// 跳过第一行
.setIgnoreFirstLine(Boolean.TRUE);
// 输出前 5 行
data.firstN(5).print();
}
}
IEDA
输出为: