LOAD DATA
命令功能
LOAD DATA命令以CarbonData特定的数据存储类型加载原始的用户数据,这样,CarbonData可以在查询数据时提供良好的性能。
仅支持加载位于HDFS上的原始数据。
命令格式
LOAD DATA INPATH 'folder_path' INTO TABLE [db_name.]table_name OPTIONS(property_name=property_value, ...);
参数描述
参数 |
描述 |
---|---|
folder_path |
原始CSV数据文件夹或者文件的路径。 |
db_name |
Database名称。若未指定,则使用当前database。 |
table_name |
所提供的database中的表的名称。 |
注意事项
以下是可以在加载数据时使用的配置选项:
- DELIMITER:可以在加载命令中提供分隔符和引号字符。默认值为,。
OPTIONS('DELIMITER'=',' , 'QUOTECHAR'='"')
可使用'DELIMITER'='\t'来表示用制表符tab对CSV数据进行分隔。
OPTIONS('DELIMITER'='\t')
CarbonData也支持\001和\017作为分隔符。
对于CSV数据,分隔符为单引号(')时,单引号必须在双引号(" ")内。例如:'DELIMITER'= "'"。
- QUOTECHAR:可以在加载命令中提供分隔符和引号字符。默认值为"。
OPTIONS('DELIMITER'=',' , 'QUOTECHAR'='"')
- COMMENTCHAR:可以在加载命令中提供注释字符。在加载操作期间,如果在行的开头遇到注释字符,那么该行将被视为注释,并且不会被加载。默认值为#。
- FILEHEADER:如果源文件中没有表头,可在LOAD DATA命令中提供表头。
- ESCAPECHAR:如果用户想在CSV上对Escape字符进行严格验证,可以提供Escape字符。默认值为\。
OPTIONS('ESCAPECHAR'='\')
如果在CSV数据中输入ESCAPECHAR,该ESCAPECHAR必须在双引号(" ")内。例如:"a\b"。
- Bad Records处理:
为了使数据处理应用程序为用户增值,不可避免地需要对数据进行某种程度的集成。在大多数情况下,数据质量问题源于生成源数据的上游(主要)系统。
有两种完全不同的方式处理Bad Data:
- 按照数据原本的样子加载所有数据,之后进行除错处理。
- 在进入数据源的过程中,可以清理或擦除Bad Data,或者在发现Bad Data时让数据加载失败。
有多个选项可用于在CarbonData数据加载过程中清除源数据。对于CarbonData数据中的Bad Records管理,请参见表2。
表2 Bad Records Logger 配置项
默认值
描述
BAD_RECORDS_LOGGER_ENABLE
false
若设置为true,则将创建Bad Records日志文件,其中包含Bad Records的详细信息。
BAD_RECORDS_ACTION
FAIL
以下为Bad Records的四种操作类型:
- FORCE:通过将Bad Records存储为NULL来自动校正数据。
- REDIRECT:无法加载Bad Records,并将其写入BAD_RECORD_PATH下的CSV文件中,默认不开启该类型,如需使用该类型,需要设置参数carbon.enable.badrecord.action.redirect为true。
- IGNORE:既不加载Bad Records也不将其写入CSV文件。
- FAIL:如果发现存在Bad Records,数据加载将会失败。
说明:
在加载数据时,如果所有记录都是Bad Records,则参数BAD_RECORDS_ACTION将不起作用,加载数据操作将会失败。
IS_EMPTY_DATA_BAD_RECORD
false
如果设置为“false”,则空(""或''或,,)数据将不被视为Bad Records,如果设置为“true”,则空数据将被视为Bad Records。
BAD_RECORD_PATH
-
指定存储Bad Records的HDFS路径。默认值为Null。 如果启用了Bad Records日志记录或者Bad Records操作重定向,则该路径必须由用户进行配置。
示例:
LOAD DATA INPATH 'filepath.csv' INTO TABLE tablename OPTIONS('BAD_RECORDS_LOGGER_ENABLE'='true', 'BAD_RECORD_PATH'='hdfs://hacluster/tmp/carbon', 'BAD_RECORDS_ACTION'='REDIRECT', 'IS_EMPTY_DATA_BAD_RECORD'='false');
使用“REDIRECT”选项,CarbonData会将所有的Bad Records添加到单独的CSV文件中,但是该文件内容不能用于后续的数据加载,因为其内容可能无法与源记录完全匹配。用户必须清理原始源记录以便于进一步的数据提取。该选项的目的只是让用户知道哪些记录被视为Bad Records。
- MAXCOLUMNS:该可选参数指定了在一行中,由CSV解析器解析的最大列数。
表3 MAXCOLUMNS 可选参数名称
默认值
最大值
MAXCOLUMNS
2000
20000
表4 MAXCOLUMNS可选参数的行为图 MAXCOLUMNS值
在文件Header选项中的列数
考虑的最终值
在加载项中未指定
5
2000
在加载项中未指定
6000
6000
40
7
文件header列数与MAXCOLUMNS值,两者中的最大值
22000
40
20000
60
在加载项中未指定
CSV文件第一行的列数与MAXCOLUMNS值,两者中的最大值
对于设置MAXCOLUMNS Option的最大值,要求executor具有足够的内存,否则,数据加载会由于内存不足的错误而失败。
- 如果在创建表期间将SORT_SCOPE定义为GLOBAL_SORT,则可以指定在对数据进行排序时要使用的分区数。如果未配置或配置小于1,则将使用map任务的数量作为reduce任务的数量。 建议每个reduce任务处理512MB - 1GB数据。
OPTIONS('GLOBAL_SORT_PARTITIONS'='2')
增加分区数可能需要增加“spark.driver.maxResultSize”,因为在driver中收集的采样数据随着分区的增加而增加。
- DATEFORMAT:此选项用于指定表的日期格式。
OPTIONS('DATEFORMAT'='dateFormat')
日期格式由日期模式字符串指定。 Carbon中的日期模式字母与JAVA中的日期模式字母相同。
- TIMESTAMPFORMAT:此选项用于指定表的时间戳格式。
- OPTIONS('TIMESTAMPFORMAT'='timestampFormat')
- SKIP_EMPTY_LINE:数据加载期间,此选项将忽略CSV文件中的空行。
- 可选:SCALE_FACTOR:针对RANGE_COLUMN,SCALE_FACTOR用来控制分区的数量,根据如下公式:
splitSize = max(blocklet_size, (block_size - blocklet_size)) * scale_factor numPartitions = total size of input data / splitSize
默认值为3,range的范围为[1, 300]。
OPTIONS('SCALE_FACTOR'='10')
- 如果GLOBAL_SORT_PARTITIONS和SCALE_FACTOR同时使用,只有GLOBAL_SORT_PARTITIONS生效。
- RANGE_COLUMN合并默认使用LOCAL_SORT。
使用场景
可使用下列语句从CSV文件加载CarbonData table。
LOAD DATA INPATH 'folder path' INTO TABLE tablename OPTIONS(property_name=property_value, ...);
示例
data.csv源文件数据如下所示:
ID,date,country,name,phonetype,serialname,salary 4,2014-01-21 00:00:00,xxx,aaa4,phone2435,ASD66902,15003 5,2014-01-22 00:00:00,xxx,aaa5,phone2441,ASD90633,15004 6,2014-03-07 00:00:00,xxx,aaa6,phone294,ASD59961,15005
CREATE TABLE carbontable(ID int, date Timestamp, country String, name String, phonetype String, serialname String,salary int) STORED AS carbondata;
LOAD DATA inpath 'hdfs://hacluster/tmp/data.csv' INTO table carbontable
options('DELIMITER'=',');
系统响应
可在driver日志中查看命令运行成功或失败。