从压缩(gz 格式)文件创建外部 table 而不选择所有字段
creating external table from compressed (gz format) files without selecting all fields
我的文件夹中有 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,我不知道该怎么做。我能做什么?
我被告知 table 必须看起来像这样
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)
这显然行不通,但也许有变通办法?
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 |
+---------------+---------------+---------------+
我的文件夹中有 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,我不知道该怎么做。我能做什么?
我被告知 table 必须看起来像这样
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)
这显然行不通,但也许有变通办法?
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 |
+---------------+---------------+---------------+