更新时间:2023-03-17 GMT+08:00

LOAD DATA

命令功能

LOAD DATA命令以CarbonData特定的数据存储类型加载原始的用户数据,这样,CarbonData可以在查询数据时提供良好的性能。

仅支持加载位于HDFS上的原始数据。

命令格式

LOAD DATA INPATH 'folder_path' INTO TABLE [db_name.]table_name OPTIONS(property_name=property_value, ...);

参数描述

表1 LOAD DATA参数描述

参数

描述

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:可以在加载命令中提供注释字符。在加载操作期间,如果在行的开头遇到注释字符,那么该行将被视为注释,并且不会被加载。默认值为#。

    OPTIONS('COMMENTCHAR'='#')

  • FILEHEADER:如果源文件中没有表头,可在LOAD DATA命令中提供表头。

    OPTIONS('FILEHEADER'='column1,column2')

  • 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,并将其写入原始CSV文件。
    • 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解析器解析的最大列数。

    OPTIONS('MAXCOLUMNS'='400')

    表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文件中的空行。

    OPTIONS('SKIP_EMPTY_LINE'='TRUE/FALSE')

  • 可选: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日志中查看命令运行成功或失败。