通过在 Hive/Athena 中的 CSV 文件中添加两列来创建外部表

问题描述

我有一个包含 A、B、C 三列的 CSV 文件

我想在它上面创建一个外部表,它有两列 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 表示:

  1. ^ - 字符串锚点的开头
  2. "? - 可选引用
  3. (.*?) - 第一列的捕获组 - 任何时候不贪婪的任何字符
  4. "? - 可选引用
  5. , - 逗号
  6. (.*) - 捕获第 2 列的组(这将捕获第一个逗号之后到最后的所有内容)
  7. $ - 字符串锚点的结尾

您可以编写正则表达式来正确捕获您的数据。 您可以在不创建表的情况下调试正则表达式,使用 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