将CSV数据加载到Hive ORC表中

时间:2019-06-11 06:23:08

标签: hadoop hive hiveql sandbox hue

我的数据如下:

id,name,description,category
1,sid,I am don,right?,production  

我遵循了this链接中提供的步骤。主要问题是,当我将数据插入到临时表中时,3rd column中的数据被分离并推入第四列,即,当它在","字之前看到right时,它将数据划分并将其推入下一列。这是因为我正在以CSV格式获取数据,因此在创建临时表时将定界符应用为","。因此,这里一团糟。我该如何解决?

按照xenodevil建议的步骤操作后,我在查询下面运行,但出现错误:

insert into perTable select * from sampleTable; 

其中sampleTable是临时表,perTable是ORC表,sampleTable数据如下:

+-----------------+-------------------+--------------------------+-----------------------+--+
| sampletable.id  | sampletable.name  | sampletable.description  | sampletable.category  |
+-----------------+-------------------+--------------------------+-----------------------+--+
| 1               | sid               | I am don,right?          | production            |
+-----------------+-------------------+--------------------------+-----------------------+--+

但是出现以下错误:

ERROR : Status: Failed
ERROR : Vertex failed, vertexName=Map 1, vertexId=vertex_1560140822404_0022_1_00, diagnostics=[Task failed, taskId=task_1560140822404_0022_1_00_000000, diagnostics=[TaskAttempt 0 failed, info=[Error: Failure while running task:java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"id":"1","name":"sid","description":"I am don,right?","category":"production"}
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:173)
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:139) 

那么这里的问题是什么??

2 个答案:

答案 0 :(得分:1)

您如何确定第3列中有多少个逗号?如果可以包含任何文本,则可以包含任意多个逗号。这必须在文件生成级别进行控制,即在写入数据时,而不是在以后尝试以CSV格式读取数据时。生成CVS文件时,您可以

  • 在作为数据一部分而不是逗号定界符的每个逗号之前放置转义字符
  • 将每列的文本括在双引号中
  • 仅用双引号括住定界字符(逗号)的列

这些是可靠解决此类问题的常见做法。

一种不可靠的方式(非常特定于所提供的数据)只能解决Reg第三行中的多余逗号,只能对行格式使用RegexSerDe

([0-9]*),([a-zA-Z ]*),([A-Za-z ,?]*),([A-Za-z ,]*)

要对此进行设置,您将需要将表的DDL修改为:

CREATE TABLE `your_database_name.your_table_name`(
    `id` string,
    `name` string,
    `description` string,
    `category` string
)
COMMENT 'Your Comment'
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='([0-9]*),([a-zA-Z ]*),([A-Za-z ,?]*),([A-Za-z ,]*)'
 )
STORED AS TEXT
;

我已经在此处检查了正则表达式,但是您将需要调整DDL语法以适合您的需求。

答案 1 :(得分:0)

您可以使用此样本流将数据加载到Hive表中。

1)由于与,分隔符相关的模棱两可,请更新文件以使分隔符为|来标识实际字段。因此,文件看起来像这样。我们称之为data.csv

1|sid|I am don,right?|production

2)在Hive中创建一个表,并指定正确的列定界符。

hive> CREATE TABLE t1_tmp
(
    id string,
    name string,
    description string,
    category string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';

3)从本地文件加载数据

hive> LOAD DATA LOCAL INPATH '/path/to/data.csv' INTO TABLE t1_tmp;

4)查看数据

hive> select * from t1_tmp;
OK
t1_tmp.id   t1_tmp.name t1_tmp.description  t1_tmp.category
1           sid         I am don,right?     production