通过在 Hive/Athena 的 CSV 文件中添加两列来创建外部 table
Create external table by adding two columns present in CSV file in Hive/Athena
我有一个包含三列 A、B、C 的 CSV 文件。
我想在它上面创建一个外部 table,它有两列 A,(B + C)。
是否可以在 table 创建过程中实现它,或者我是否应该在创建 table 后创建一个视图?
无法使用 CSVSerDe 或 LasySimpleSerDe,但可以使用 RegexSerDe。
table 定义中的每一列都应该在 input.regex.
中有相应的捕获组 ()
例如,如果文件是逗号分隔的,table可以这样定义:
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 列的组(这将捕获第一个逗号之后的所有内容,直到结尾)
$
- 字符串锚点的结尾
您可以编写能够正确捕获数据的正则表达式。
您可以在不创建 table 的情况下调试正则表达式,使用 regexp_replace
:
select regexp_replace('"A",B,C', --data string example
'^"?(.*?)"?,(.*)$', --regex with 2 capturing groups for 2 columns
' | '); --pipe delimited columns should be returned
我有一个包含三列 A、B、C 的 CSV 文件。
我想在它上面创建一个外部 table,它有两列 A,(B + C)。
是否可以在 table 创建过程中实现它,或者我是否应该在创建 table 后创建一个视图?
无法使用 CSVSerDe 或 LasySimpleSerDe,但可以使用 RegexSerDe。 table 定义中的每一列都应该在 input.regex.
中有相应的捕获组 ()例如,如果文件是逗号分隔的,table可以这样定义:
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 列的组(这将捕获第一个逗号之后的所有内容,直到结尾)$
- 字符串锚点的结尾
您可以编写能够正确捕获数据的正则表达式。
您可以在不创建 table 的情况下调试正则表达式,使用 regexp_replace
:
select regexp_replace('"A",B,C', --data string example
'^"?(.*?)"?,(.*)$', --regex with 2 capturing groups for 2 columns
' | '); --pipe delimited columns should be returned