Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 如何在配置单元中分隔列_Hive_Create Table_Hive Serde_Hiveddl - Fatal编程技术网

Hive 如何在配置单元中分隔列

Hive 如何在配置单元中分隔列,hive,create-table,hive-serde,hiveddl,Hive,Create Table,Hive Serde,Hiveddl,我有一个文件: id,name,address 001,adam,1-A102,mont vert 002,michael,57-D,costa rica 我必须创建一个配置单元表,该表将包含三列:id、name和address,使用逗号分隔,但此处address列本身包含逗号。我们将如何处理此问题。一种可能的解决方案是使用RegexSerDe: CREATE TABLE table my_table ( id string, name string,

我有一个文件:

id,name,address
001,adam,1-A102,mont vert
002,michael,57-D,costa rica

我必须创建一个配置单元表,该表将包含三列:
id
name
address
,使用逗号分隔,但此处address列本身包含逗号。我们将如何处理此问题。

一种可能的解决方案是使用RegexSerDe:

CREATE TABLE table my_table (
    id       string,
    name     string,
    address  string
) 
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES ('input.regex'='^(.*?),(.*?),(.*?)$') 
location 'put location here' 
;
将location属性替换为表位置,并将文件放入该位置

第一组将匹配第一个逗号之前的所有内容,第二组将匹配第一个逗号之后和第二个逗号之前的所有内容,第三组将匹配第二个逗号之后的所有内容

如果需要跳过头并且它始终存在于文件中,还可以添加
TBLProperty(“skip.header.line.count”=“1”)
。若标题可以不存在,那个么您可以使用
where id!='id'

此外,即使不创建表,您也可以轻松测试正则表达式以提取列,如下所示:

select regexp_replace('002,michael,57-D,costa rica','^(.*?),(.*?),(.*?)$','$1|$2|$3');
select regexp_replace('001,adam,1-A102, mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','$1|$2|$3|$4');
结果:

002|michael|57-D,costa rica
在本例中,查询返回三个组,以|分隔。通过这种方式,您可以轻松地测试正则表达式,在使用正则表达式创建表之前检查是否正确定义了组

回答评论中的问题。您可以有带逗号的地址和一个以上不带逗号的列,如下所示:

select regexp_replace('002,michael,57-D,costa rica','^(.*?),(.*?),(.*?)$','$1|$2|$3');
select regexp_replace('001,adam,1-A102, mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','$1|$2|$3|$4');
返回:

001|adam|1-A102, mont vert|sydney
在地址列中检查逗号是可选的:

hive> select regexp_replace('001,adam,1-A102 mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','$1|$2|$3|$4');
返回:

001|adam|1-A102 mont vert|sydney
阅读本文以更好地理解:

[^,]
表示不是逗号,最后一列可以是除逗号以外的所有内容


当然,在DDL中再添加一列。

id、姓名、地址、城市001、亚当、1-A102、蒙特维特、悉尼002、迈克尔、57-D、哥斯达黎加、墨尔本假设我在这里再添加一列,那个么,我们将如何在这里实现serde。@SanskarSuman,您如何定义规则来确定它是包含逗号的地址还是包含逗号的城市地址?我问这个是因为你说地址可以包含逗号。如果您能够定义规则,那么应该可以实现regex。如果我在末尾有一个额外的列city,那么我如何确保这些数据将加载到配置单元表中的最后一列,例如:-输出-002 | michael | 57-D,哥斯达黎加|悉尼输入-002,michael,57-D,哥斯达黎加,悉尼考虑地址栏不包含任何城市名称,我们有一个单独的城市专栏。