在配置单元表中以csv格式加载数据

bzzcjhmw  于 2021-06-02  发布在  Hadoop
关注(0)|答案(4)|浏览(452)

我正在尝试将以下数据存储在csv文件中的配置单元表中,但无法成功执行

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

数据存在于csv文件中。我在配置单元中使用以下定义创建了表:

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

我想不出这个错误。结果数据没有加载到表中。

deyfvvtc

deyfvvtc1#

你不应该需要regexserde。您应该能够将分隔符设置为逗号。 CREATE TABLE test1 (Name String, Perc String, Rank String) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; 你也可以看看这个cvs服务器。https://github.com/ogrodnek/csv-serde

yacmzcpb

yacmzcpb2#

使用 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')

这样,您就可以完全控制分隔符、引号字符、转义字符、空处理和头处理。
看看这里和这里。

g2ieeal7

g2ieeal73#

你能像这样使用hive的内置regexp 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;
inn6fuwd

inn6fuwd4#

根据示例cvs数据,regex不匹配尾随逗号,也不匹配cvs数据的第一个示例行中显示的可选空格字符。正则表达式应该从:^(\w+)\,(\w+)%\,(\w+)$更改为:^(\w+)\,\s*(\w+)%\,(\w+)$

相关问题