Lo que kmosley dijo es verdad. A partir de ahora, no puede seleccionar selectivamente ciertos archivos para que formen parte de su tabla Hive. Sin embargo, hay dos formas de evitarlo.
Opción 1: puede mover todos los archivos CSV en otro directorio HDFS y crear una mesa Colmena por encima de eso. Si funciona mejor para usted, puede crear un subdirectorio (por ejemplo, csv) dentro de su directorio actual que contenga todos los archivos CSV. A continuación, puede crear una tabla Hive en la parte superior de este subdirectorio. Tenga en cuenta que las tablas de Hive creadas en la parte superior del directorio principal NO contendrán los datos del subdirectorio.
Opción 2: Usted puede cambiar sus consultas a hacer uso de una columna virtual llamado INPUT__FILE__NAME
.
Su consulta sería algo como:
SELECT
*
FROM
my_table
WHERE
INPUT__FILE__NAME LIKE '%csv';
El mal efecto de este enfoque es que la consulta Colmena tendrá que batir a través de los datos completos presentes en el directorio a pesar de que sólo se preocupaba por archivos específicos. La consulta no filtrará los archivos basados en el predicado usando INPUT__FILE__NAME
. Simplemente filtrará los registros que no provienen de la coincidencia del predicado usando INPUT__FILE__NAME
durante la fase del mapa (en consecuencia filtrando todos los registros de archivos particulares), pero los correlacionadores también se ejecutarán en archivos innecesarios. Le dará el resultado correcto, podría tener una sobrecarga de rendimiento, probablemente menor.
El beneficio de este enfoque es que puede usar la misma tabla Hive si tiene varios archivos en la tabla y desea consultar todos los archivos de esa tabla (o su partición) en algunas consultas y un subconjunto de los archivos en otras consultas. Puede hacer uso de la columna virtual INPUT__FILE__NAME
para lograr eso.A modo de ejemplo: si una partición en el directorio de HDFS /user/hive/warehouse/web_logs/
parecía:
/user/hive/warehouse/web_logs/dt=2012-06-30/
/user/hive/warehouse/web_logs/dt=2012-06-30/00.log
/user/hive/warehouse/web_logs/dt=2012-06-30/01.log
.
.
.
/user/hive/warehouse/web_logs/dt=2012-06-30/23.log
Digamos que su definición de la tabla parecía:
CREATE EXTERNAL TABLE IF NOT EXISTS web_logs_table (col1 STRING)
PARTITIONED BY (dt STRING)
LOCATION '/user/hive/warehouse/web_logs';
Después de añadir las particiones apropiadas, se puede consultar todos los registros en la partición utilizando una consulta como:
SELECT
*
FROM
web_logs_table w
WHERE
dt='2012-06-30';
Sin embargo, si sólo se preocupaba por los registros de la primera hora del día, usted podría consultar los registros de la primera hora utilizando una consulta como:
SELECT
*
FROM
web_logs_table w
WHERE
dt ='2012-06-30'
AND INPUT__FILE__NAME='00.log';
Otro caso de uso similar podría ser un directorio que contiene registros de la tela de diferentes dominios y varias consultas necesidad de analizar los registros en diferentes conjuntos de dominios. Las consultas pueden filtrar dominios mediante la columna virtual INPUT__FILE__NAME
.
En los dos casos de uso anteriores, tener una subpartición por hora o dominio también resolvería el problema, sin tener que usar la columna virtual. Sin embargo, puede haber algunas concesiones de diseño que requieren que no se creen subparticiones. En ese caso, podría decirse que usar la columna virtual INPUT__FILE__NAME
es su mejor apuesta.
Decidir entre las 2 opciones:
Realmente depende de su caso de uso. Si nunca le importarían los archivos que está tratando de excluir de la tabla Hive, usar la Opción 2 es probablemente una exageración y debe arreglar la estructura del directorio y crear una tabla Hive en la parte superior del directorio que contenga los archivos que le interesan. .
Si los archivos que actualmente excluye siguen el mismo formato que los otros archivos (para que todos puedan ser parte de la misma tabla Hive) y podría verse escribiendo una consulta que analizaría todos los datos en el directorio, luego vaya con la Opción 2.
no funciona con opencsvserde – thebluephantom