如何在配置单元中分隔列
how to separate columns in hive
我有一个文件:
id,name,address
001,adam,1-A102,mont vert
002,michael,57-D,costa rica
我必须创建一个包含三列的配置单元 table:id
、name
和 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'
;
将位置 属性 替换为您的 table 位置并将文件放入该位置。
第一组 (.*?)
将匹配第一个逗号之前的所有内容,第二组将匹配第一个逗号之后和第二个逗号之前的所有内容,第三组将匹配第二个逗号之后的所有内容。
如果您需要跳过 header 并且它始终存在于文件中,则还要添加 TBLPROPERTIES("skip.header.line.count"="1")
。如果 header 可以不存在,那么您可以使用 where id !='id'
过滤 header 行
您也可以轻松测试 Regex 以提取列,即使不创建 table,如下所示:
select regexp_replace('002,michael,57-D,costa rica','^(.*?),(.*?),(.*?)$','||');
结果:
002|michael|57-D,costa rica
在此示例中查询 returns 三个组,以 | 分隔。通过这种方式,您可以轻松地测试您的正则表达式,在使用它创建 table 之前检查是否正确定义了组。
在评论中回答问题。你可以有带逗号的地址和一列不带逗号的地址:
select regexp_replace('001,adam,1-A102, mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','|||');
Returns:
001|adam|1-A102, mont vert|sydney
在地址列中检查逗号是可选的:
hive> select regexp_replace('001,adam,1-A102 mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','|||');
Returns:
001|adam|1-A102 mont vert|sydney
[^,]
表示不是逗号,最后一列可以是逗号以外的任何内容。
当然还要向 DDL 添加一列。
我有一个文件:
id,name,address
001,adam,1-A102,mont vert
002,michael,57-D,costa rica
我必须创建一个包含三列的配置单元 table:id
、name
和 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'
;
将位置 属性 替换为您的 table 位置并将文件放入该位置。
第一组 (.*?)
将匹配第一个逗号之前的所有内容,第二组将匹配第一个逗号之后和第二个逗号之前的所有内容,第三组将匹配第二个逗号之后的所有内容。
如果您需要跳过 header 并且它始终存在于文件中,则还要添加 TBLPROPERTIES("skip.header.line.count"="1")
。如果 header 可以不存在,那么您可以使用 where id !='id'
您也可以轻松测试 Regex 以提取列,即使不创建 table,如下所示:
select regexp_replace('002,michael,57-D,costa rica','^(.*?),(.*?),(.*?)$','||');
结果:
002|michael|57-D,costa rica
在此示例中查询 returns 三个组,以 | 分隔。通过这种方式,您可以轻松地测试您的正则表达式,在使用它创建 table 之前检查是否正确定义了组。
在评论中回答问题。你可以有带逗号的地址和一列不带逗号的地址:
select regexp_replace('001,adam,1-A102, mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','|||');
Returns:
001|adam|1-A102, mont vert|sydney
在地址列中检查逗号是可选的:
hive> select regexp_replace('001,adam,1-A102 mont vert,sydney','^(.*?),(.*?),(.*?),([^,]*?)$','|||');
Returns:
001|adam|1-A102 mont vert|sydney
[^,]
表示不是逗号,最后一列可以是逗号以外的任何内容。
当然还要向 DDL 添加一列。