从压缩(gz格式)文件创建外部表而不选择所有字段

时间:2017-03-29 13:08:11

标签: sql hive external-tables

我在一个文件夹中有gz文件。我只需要这些文件中的3列,但每行有超过100列。目前我以这种方式创建了一个视图。

drop table MAK_CHARGE_RCR;
create external table MAK_CHARGE_RCR
(LINE string)
STORED as SEQUENCEFILE
LOCATION '/apps/hive/warehouse/mydb.db/file_rcr';

drop view VW_MAK_CHARGE_RCR;
create view VW_MAK_CHARGE_RCR as
Select LINE[57] as CREATE_DATE, LINE[64] as SUBS_KEY, LINE[63] as RC_TERM_NAME 
from
    (Select split(LINE, '\\|') as LINE
    from MAK_CHARGE_RCR) a;

视图包含我需要的字段。现在我必须这样做,但没有CTAS,我不知道如何去做。我该怎么办?

我被告知桌子必须看起来像这样

create external table MAK_CHARGE_RCR
(CREATE_DATE string, SUBS_KEY string, RC_TERM_NAME etc)

我可以像这样分割线

ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\\|'

但是我需要列出每一列。我有另一组超过1000列的文件。所有这些我都需要列出。这看起来有点过分,所以我想知道是否可以做到

create external table arstel.MAK_CHARGE_RCR
(split(LINE, '\\|')[57] string,
split(LINE, '\\|')[64] string
etc)

这显然不起作用,但也许有解决方法吗?

1 个答案:

答案 0 :(得分:1)

<强> RegexSerDe

出于教育目的

P.S。
我打算创建一个CSV SerDe的增强版本,除了带有所请求列的位置的附加参数。

演示

<强>的bash

echo {a..c}{1..100} | xargs -n 100 | tr ' ' '|'  | \
hdfs dfs -put - /user/hive/warehouse/mytable/data.txt

<强>蜂房

create external table mytable
(
    col58   string
   ,col64   string
   ,col65   string
)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ("input.regex" = "^(?:([^|]*)\\|){58}(?:([^|]*)\\|){6}([^|]*)\\|.*$")
stored as textfile
location '/user/hive/warehouse/mytable'
;
select * from mytable
;
+---------------+---------------+---------------+
| mytable.col58 | mytable.col64 | mytable.col65 |
+---------------+---------------+---------------+
| a58           | a64           | a65           |
| b58           | b64           | b65           |
| c58           | c64           | c65           |
+---------------+---------------+---------------+