我试图将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
我无法弄清楚错误。结果数据未加载到表中。
答案 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')
通过这种方式,您可以完全控制分隔符,引号字符,转义字符,空值处理和标题处理。
答案 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 +)\,$