我的数据如下:
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)
那么这里的问题是什么??
答案 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