将csv数据加载到hive orc表中

64jmpszr  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(643)

我的数据如下:

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

我遵循了这个链接中提供的步骤。主要的问题是当我将数据插入temp表时 3rd column 被分离并被推到第四列,即当它看到 "," 之前 right word它将数据分割并将其推入下一列。这是因为我得到的是csv格式的数据,因此将分隔符作为 "," 创建临时表时。所以,这里一团糟。我怎样才能解决它??
按照 xenodevil ,我运行了下面的查询,发现错误:

insert into perTable select * from sampleTable;

其中sampletable是temp表,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)

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

knpiaxh1

knpiaxh11#

可以使用此示例流在配置单元表中加载数据。
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
ipakzgxi

ipakzgxi2#

你将如何确定第三列有多少逗号?如果它可以包含任何文本,那么它可以包含任意数量的逗号。这必须在文件生成级别进行控制,即在写入数据时,而不是在以后尝试以csv格式读取数据时。在生成cvs文件时,您可以
在作为数据一部分的每个逗号前放置转义字符,而不是逗号分隔符
将每列的文本用双引号括起来
仅用双引号将存在分隔符(逗号)的列括起来
这些是可靠解决此类问题的一些常见做法。
一种不可靠的方法是使用下面的regexserde作为行格式,这种方法非常特定于您提供的数据,并且只会解析第3列中的冗余逗号

([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
;

我在这里检查了regex,但是您需要调整ddl语法以满足您的需要。

相关问题