LOAD DATA INFILE
Contents
LOAD DATA INFILE#
LOAD DATA INFILE
语句能高效地将文件中的数据读取到数据库中的表中。LOAD DATA INFILE
与 SELECT INTO OUTFILE
互补。要将数据从 table导出到文件,请使用SELECT INTO OUTFILE。要将文件数据导入到 table 中,请使用LOAD DATA INFILE
。
Syntax#
LoadDataInfileStmt
::= 'LOAD' 'DATA' 'INFILE' filePath 'INTO' 'TABLE' tableName LoadDataInfileOptionsList
filePath
::= URI
tableName
::= string_literal
LoadDataInfileOptionsList
::= 'OPTIONS' '(' LoadDataInfileOptionItem (',' LoadDataInfileOptionItem)* ')'
LoadDataInfileOptionItem
::= 'DELIMITER' '=' string_literal
|'HEADER' '=' bool_literal
|'NULL_VALUE' '=' string_literal
|'FORMAT' '=' string_literal
|'QUOTE' '=' string_literal
|'MODE' '=' string_literal
|'DEEP_COPY' '=' bool_literal
|'LOAD_MODE' '=' string_literal
|'THREAD' '=' int_literal
URI
::= 'file://FilePathPattern'
|'hdfs://FilePathPattern'
|'hive://[db.]table'
|'FilePathPattern'
FilePathPattern
::= string_literal
其中FilePathPattern
支持通配符*
,比如可以设成/test/*.csv
,匹配规则和ls FilePathPattern
一致。
下表展示了LOAD DATA INFILE
语句的配置项。
配置项 |
类型 |
默认值 |
描述 |
---|---|---|---|
delimiter |
String |
, |
列分隔符,默认为 |
header |
Boolean |
true |
是否包含表头, 默认为 |
null_value |
String |
null |
NULL值,默认填充 |
format |
String |
csv |
导入文件的格式: |
quote |
String |
“ |
输入数据的包围字符串。字符串长度<=1。 |
mode |
String |
“error_if_exists” |
导入模式: |
deep_copy |
Boolean |
true |
|
load_mode |
String |
cluster |
|
thread |
Integer |
1 |
仅在本地文件导入时生效,即 |
Note
在集群版中,LOAD DATA INFILE
语句会根据当前执行模式(execute_mode)决定将数据导入到在线或离线存储。单机版中没有存储区别,只会导入到在线存储中,同时也不支持deep_copy
选项。
具体的规则见下文。
Warning
INFILE Path
在集群版中,如果load_mode='cluster'
,INFILE
路径的读取是由batchjob来完成的,如果是相对路径,就需要batchjob可以访问到的相对路径。
在生产环境中,batchjob的执行通常由yarn集群调度,难以确定具体的执行者。在测试环境中,如果也是多机部署,难以确定batchjob的具体执行者。
所以,请尽量使用绝对路径。单机测试中,本地文件用file://
开头;生产环境中,推荐使用hdfs等文件系统。
SQL语句模版#
LOAD DATA INFILE 'file_name' INTO TABLE 'table_name' OPTIONS (key = value, ...);
Hive 支持#
OpenMLDB 支持从 Hive 导入数据,但需要额外的设置和功能限制,详情见 Hive 支持。
Examples:#
从data.csv
文件读取数据到表t1
在线存储中。并使用,
作为列分隔符
set @@execute_mode='online';
LOAD DATA INFILE 'data.csv' INTO TABLE t1 OPTIONS(delimiter = ',' );
从data.csv
文件读取数据到表t1
中。并使用,
作为列分隔符, 字符串”NA”将被替换为NULL。
LOAD DATA INFILE 'data.csv' INTO TABLE t1 OPTIONS(delimiter = ',', null_value='NA');
将data_path
软拷贝到表t1
中,作为离线数据。
set @@execute_mode='offline';
LOAD DATA INFILE 'data_path' INTO TABLE t1 OPTIONS(deep_copy=false);
在离线模式下导入 Hive 数据仓库的表格:
set @@execute_mode='offline';
LOAD DATA INFILE 'hive://db1.t1' INTO TABLE t1;
在线导入规则#
在线导入只允许mode='append'
,无法overwrite
或error_if_exists
。
离线导入规则#
表的离线信息可通过desc