【问题标题】:External Tables (HIVE) Choose only a few columns from a file外部表 (HIVE) 从文件中仅选择几列
【发布时间】:2015-01-30 12:00:50
【问题描述】:

我怎样才能创建一个外部表设置只有文件中的几列?

例如:在存档中,我有六列,A、B、C、D、E、F。但在我的桌子上,我只想要 A、C、F。

有可能吗?

【问题讨论】:

  • 你打算通过Hive修改这些数据,还是只读取?

标签: hive external-tables


【解决方案1】:

我不知道有选择地将 HDFS 文件中的列包含在外部表中的方法。根据您的用例,基于外部表定义视图以仅包含您想要的列可能就足够了。例如,给定以下外部表的愚蠢示例:

hive> CREATE EXTERNAL TABLE ext_table (
    >   A STRING,
    >   B STRING,
    >   C STRING,
    >   D STRING,
    >   E STRING,
    >   F STRING
    > )
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    > STORED AS TEXTFILE
    > LOCATION '/tmp/ext_table';
OK
Time taken: 0.401 seconds
hive> SELECT * FROM ext_table;
OK
row_1_col_A row_1_col_B     row_1_col_C     row_1_col_D     row_1_col_E     row_1_col_F
row_2_col_A row_2_col_B     row_2_col_C     row_2_col_D     row_2_col_E     row_2_col_F
row_3_col_A row_3_col_B     row_3_col_C     row_3_col_D     row_3_col_E     row_3_col_F
Time taken: 0.222 seconds, Fetched: 3 row(s)

然后创建一个仅包含您想要的列的视图:

hive> CREATE VIEW filtered_ext_table AS SELECT A, C, F FROM ext_table;
OK
Time taken: 0.749 seconds
hive> DESCRIBE filtered_ext_table; 
OK
a                           string                              
c                           string                              
f                           string                              
Time taken: 0.266 seconds, Fetched: 3 row(s)
hive> SELECT * FROM filtered_ext_table;
OK
row_1_col_A row_1_col_C     row_1_col_F
row_2_col_A row_2_col_C     row_2_col_F
row_3_col_A row_3_col_C     row_3_col_F
Time taken: 0.301 seconds, Fetched: 3 row(s)

实现您想要的另一种方法要求您能够修改支持外部表的 HDFS 文件 - 如果您感兴趣的列都在每行的开头附近,那么您可以定义您的外部表仅捕获前 3 列(不考虑文件中实际还有多少列)。比如和上面一样的数据文件:

hive> DROP TABLE IF EXISTS ext_table;
OK
Time taken: 1.438 seconds
hive> CREATE EXTERNAL TABLE ext_table (
    >   A STRING,
    >   B STRING,
    >   C STRING
    > )
    > ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
    > STORED AS TEXTFILE
    > LOCATION '/tmp/ext_table';
OK
Time taken: 0.734 seconds
hive> SELECT * FROM ext_table;
OK
row_1_col_A row_1_col_B     row_1_col_C
row_2_col_A row_2_col_B     row_2_col_C
row_3_col_A row_3_col_B     row_3_col_C
Time taken: 0.727 seconds, Fetched: 3 row(s)

【讨论】:

  • 谢谢你的回答,rchang。这就是我们实际使用的方式。我们希望在 create 语句中这样做以简化我们的流程。有可能吗?
  • @ElderChaves 在一般情况下,我不知道该怎么做。但是,我在答案的结尾添加了另一种选择。这是一个非常特殊的情况,即您感兴趣的列位于每行的开头附近,而您只想忽略该行的其余部分(例如,您对 12 个字段中的前 4 个字段感兴趣)。
  • 赞成。答案很有用。 (在没有任何评论的情况下投票是一种不当行为。)
【解决方案2】:

我找到了答案here

create table tmpdc_ticket(
    SERVICE_ID CHAR(144),
    SERVICE_TYPE CHAR(50),
    CUSTOMER_NAME CHAR(200),
    TELEPHONE_NO CHAR(144),
    ACCOUNT_NUMBER CHAR(144),
    FAULT_STATUS CHAR(50),
    BUSINESS_GROUP CHAR(100)
)
organization external(
    type    oracle_loader
    default directory sample_directory
    access parameters(
        records delimited by newline
        nologfile
        skip 1
        fields terminated by '|'
        missing field values are null
            (DUMMY_1,
             DUMMY_2,
             SERVICE_ID CHAR(144),
             SERVICE_TYPE CHAR(50),
             CUSTOMER_NAME CHAR(200),
             TELEPHONE_NO CHAR(144),
             ACCOUNT_NUMBER CHAR(144),
             FAULT_STATUS CHAR(50),
             BUSINESS_GROUP CHAR(100)
        )
    )
    location(sample_directory:'sample_file.txt')
)
reject limit 1
noparallel
nomonitoring;

【讨论】:

  • 那是oracle,不是hive。
猜你喜欢
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
相关资源
最近更新 更多