2015-01-30 4 views
1

Как создать внешнюю таблицу, устанавливающую только несколько столбцов из файла?Внешние таблицы (HIVE) Выберите только несколько столбцов из файла

Ex: В архиве у меня есть шесть столбцов, A, B, C, D, E, F. Но в моей таблице я хочу только A, C, F.

Возможно ли это?

+0

Вы намерены изменить эти данные через улей, или только читать? – rchang

ответ

0

Я не знаю, как выборочно включать столбцы из файлов 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, поддерживающие вашу внешнюю таблицу, - если интересующие вас столбцы находятся рядом с началом каждой строки, то вы можете определить свою внешнюю таблицу для записи только первых трех столбцов (без учета того, сколько еще столбцы фактически находятся в файле). Например, с помощью того же файла данных, как описано выше:

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) 
+0

Спасибо за ответ, rchang. Это то, как мы используем на самом деле. Мы хотим сделать это в инструкции create, чтобы упростить наши процессы. Является ли это возможным? –

+0

@ ElderChaves В общем случае я не знаю, как делать то, что вы хотите сделать. Однако я добавил еще одну альтернативу моему концу. Это довольно специализированный случай, а именно то, что интересующие вас столбцы находятся рядом с началом каждой строки, и вы хотите просто игнорировать остальную часть строки (например, вас интересуют первые 4 из 12 полей). – rchang

+0

upvoted. ответ был полезен. (downvoting без комментариев - такая халатность.) –

-1

Я нашел ответ 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; 
+0

То есть для оракула, а не улья. – YoYo