我们可以将::分隔的文本文件加载到配置单元表中吗?

时间:2018-11-07 18:53:33

标签: hive

是否有一种方法可以将简单的文本文件加载到配置单元表中,而用“ ::”将字段分开,而不是将“ ::”替换为“,”,然后再加载它?  当文本文件较小时,用“,”替换“ ::”会更快,但是如果包含数百万条记录呢?

1 个答案:

答案 0 :(得分:0)

尝试使用 Regex Serde

创建Hive表

示例:

我的文件中带有以下文字。

i::90
w::99

创建配置单元表:

hive> create external table default.i
(Id STRING,
Name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ('input.regex' = '(.*?)::(.*)')
STORED AS TEXTFILE;

从Hive表中选择:

hive> select * from i;
+-------+---------+--+
| i.id  | i.name  |
+-------+---------+--+
| i     | 90      |
| w     | 99      |
+-------+---------+--+

如果要跳过标题,请使用以下语法:

hive> create external table default.i
(Id STRING,
Name STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ('input.regex' = '(.*?)::(.*)')
STORED AS TEXTFILE
tblproperties ('skip.header.line.count'='1');
  

更新:

检查您的表位置中是否有older files 。如果其中有一些文件,则将其删除(if you don't want them)

1。创建Hive表为:

create external table <db_name>.<table_name>
(col1 STRING,
col2 STRING,
col3 string,
col4 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe' 
WITH SERDEPROPERTIES ('input.regex' = '(.*?)::(.*?)::(.*?)::(.*)')
STORED AS TEXTFILE;

2。然后运行:

load data local inpath 'Source path' overwrite into table 'Destination table'