问题描述
我想在它上面创建一个外部表,它有两列 A,(B + C)。
是否可以在表创建过程中实现它,还是应该在创建表后创建视图?
解决方法
无法使用 CSVSerDe 或 LasySimpleSerDe,但可以使用 RegexSerDe。 表定义中的每一列在 input.regex 中都应该有对应的捕获组()。
例如,如果文件是逗号分隔的,表可以这样定义:
CREATE EXTERNAL TABLE mytable(
colA string COMMENT '',colBC string COMMENT '')
ROW FORMAT SERDE
'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex'= '^"?(.*?)"?,(.*)$'
LOCATION ...
input.regex 表示:
-
^
- 字符串锚点的开头 -
"?
- 可选引用 -
(.*?)
- 第一列的捕获组 - 任何时候不贪婪的任何字符 -
"?
- 可选引用 -
,
- 逗号 -
(.*)
- 捕获第 2 列的组(这将捕获第一个逗号之后到最后的所有内容) -
$
- 字符串锚点的结尾
您可以编写正则表达式来正确捕获您的数据。
您可以在不创建表的情况下调试正则表达式,使用 regexp_replace
:
select regexp_replace('"A",B,C',--data string example
'^"?(.*?)"?,(.*)$',--regex with 2 capturing groups for 2 columns
'$1 | $2'); --pipe delimited columns should be returned