在Hive表中以CSV格式加载数据

时间:2015-05-28 13:12:28

标签: regex csv hadoop hive

我试图将csv文件中的以下数据存储到Hive表中,但无法成功完成

Ann, 78%,7,  
Beth,81%,5,  
Cathy,83%,2,  

数据存在于CSV文件中。我使用以下定义在Hive中创建了表:

Hive> CREATE TABLE test1 (Name String, Perc String, Rank String)  
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'  
WITH SERDEPROPERTIES ("input.regex" = "^(\w+)\,(\w+)\%\,(\w+)$",  
"output.format.string" = "%1$s %2$s %3$s" )
STORED AS TEXTFILE;"      
ok
hive> load data local inpath '/tmp/input.csv' into table test1;  
ok  
hive> Select * from test1;  
ok  

Name    Perc    Rank  
Null    Null    Null  
Null    Null    Null  
Null    Null    Null  

我无法弄清楚错误。结果数据未加载到表中。

4 个答案:

答案 0 :(得分:1)

您不应该需要RegexSerDe。您应该只能将分隔符设置为逗号。

CREATE TABLE test1 (Name String, Perc String, Rank String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE;

您还可以查看此CVS Serde。 https://github.com/ogrodnek/csv-serde

答案 1 :(得分:1)

如果您需要灵活性,请使用OpenCSVSerde

CREATE EXTERNAL TABLE `mydb`.`mytable`(
    `product_name` string,
    `brand_id` string,
    `brand` string,
    `color` string,
    `description` string,
    `sale_price` string)
PARTITIONED BY (
    `seller_id` string)
ROW FORMAT SERDE
    'org.apache.hadoop.hive.serde2.OpenCSVSerde'
WITH SERDEPROPERTIES (
    'separatorChar' = '\t',
    'quoteChar' = '"',
    'escapeChar' = '\\')
STORED AS INPUTFORMAT
    'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
    'hdfs://namenode.com:port/data/mydb/mytable'
TBLPROPERTIES (
    'serialization.null.format' = '',
    'skip.header.line.count' = '1')

通过这种方式,您可以完全控制分隔符,引号字符,转义字符,空值处理和标题处理。

查看herehere

答案 2 :(得分:0)

您是否可以像这样使用HIVE的内置正则表达式UDF:

create table temp (raw STRING);

load data local inpath '/tmp/input.csv' into table temp;

create table table1
as
select regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 1) Name,
regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 2) Perc,
regexp_extract(line, "^(\w+)\,(\w+)\%\,(\w+)$", 3) Rank
from temp;

答案 3 :(得分:0)

根据您的示例cvs数据,您的正则表达式与尾随逗号不匹配,并且它也不匹配可选空格字符,如cvs数据的第一个示例行中所示。你的正则表达式应该改为: ^(\ w +)\(\ w +)\%\(\ w +)$ 至: ^(\ W +)\,\ S *(\ W +)\%\,(\ W +)\,$