Was kmosley gesagt ist wahr. Ab jetzt können Sie bestimmte Dateien nicht selektiv als Teil Ihrer Hive-Tabelle auswählen. Es gibt jedoch 2 Möglichkeiten, um es zu umgehen.
Option 1: Sie können alle CSV-Dateien in ein anderes HDFS-Verzeichnis verschieben und darüber hinaus eine Hive-Tabelle erstellen. Wenn es für Sie besser funktioniert, können Sie ein Unterverzeichnis (z. B. csv) in Ihrem vorhandenen Verzeichnis erstellen, das alle CSV-Dateien enthält. Sie können dann eine Hive-Tabelle oberhalb dieses Unterverzeichnisses erstellen. Beachten Sie, dass alle oberhalb des übergeordneten Verzeichnisses erstellten Hive-Tabellen KEINE Daten aus dem Unterverzeichnis enthalten.
Option 2: Sie können Ihre Fragen ändern INPUT__FILE__NAME
genannt Verwendung einer virtuellen Spalte zu machen.
Ihre Anfrage würde in etwa so aussehen:
SELECT
*
FROM
my_table
WHERE
INPUT__FILE__NAME LIKE '%csv';
Die schlecht Wirkung dieses Ansatzes besteht darin, dass die Hive-Abfrage über gesamten Daten in dem Verzeichnis Churn haben, auch wenn Sie nur über bestimmte Dateien gepflegt. Die Abfrage filtert keine Dateien basierend auf dem Prädikat mit INPUT__FILE__NAME
heraus. Es wird nur herausgefiltert, dass die Datensätze, die nicht aus dem Prädikat kommen, während der Map-Phase INPUT__FILE__NAME
verwenden (folglich werden alle Datensätze aus bestimmten Dateien herausgefiltert), aber die Mapper würden auch auf unnötigen Dateien laufen. Es wird Ihnen das richtige Ergebnis geben, könnte einige, wahrscheinlich geringe, Leistungs Overhead haben. Der Vorteil dieses Ansatzes besteht darin, dass Sie die gleiche Hive-Tabelle verwenden können, wenn Sie mehrere Dateien in Ihrer Tabelle haben und die Möglichkeit haben möchten, alle Dateien aus dieser Tabelle (oder ihrer Partition) in einigen Abfragen und einer Teilmenge abzufragen der Dateien in anderen Abfragen. Sie könnten die virtuelle Spalte INPUT__FILE__NAME
verwenden, um dies zu erreichen.Als Beispiel: , wenn eine Partition in Ihrem HDFS Verzeichnis /user/hive/warehouse/web_logs/
sah aus wie:
/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
Ihre Tabellendefinition sagen Lassen Sie sah aus wie:
CREATE EXTERNAL TABLE IF NOT EXISTS web_logs_table (col1 STRING)
PARTITIONED BY (dt STRING)
LOCATION '/user/hive/warehouse/web_logs';
Nachdem die entsprechenden Partitionen hinzufügen, Sie alle Protokolle abfragen könnten in die Partition eine Abfrage wie mit:
SELECT
*
FROM
web_logs_table w
WHERE
dt='2012-06-30';
wenn Sie jedoch nur über die Protokolle von der ersten Stunde des Tages betreut, konnte man abfragen, um die Protokolle für die erste Stunde mit einer Abfrage wie:
SELECT
*
FROM
web_logs_table w
WHERE
dt ='2012-06-30'
AND INPUT__FILE__NAME='00.log';
Ein weiterer ähnlicher Anwendungsfall könnte ein Verzeichnis sein, das Web-Logs aus verschiedenen Bereichen und verschiedene Abfragen enthält müssen Protokolle auf verschiedene Gruppen von Domänen analysieren. Die Abfragen können Domänen mit der virtuellen Spalte INPUT__FILE__NAME
herausfiltern.
In den beiden obigen Anwendungsfällen würde das Problem mit einer Unterpartition für Stunde oder Domäne gelöst werden, ohne die virtuelle Spalte verwenden zu müssen. Es gibt jedoch möglicherweise einige Design-Kompromisse, bei denen Sie keine Unterpartitionen erstellen müssen. In diesem Fall ist die virtuelle Spalte INPUT__FILE__NAME
die beste Wahl.
Die Entscheidung zwischen den zwei Optionen:
Es hängt wirklich von Ihrem Anwendungsfall. Wenn Sie sich nie um die Dateien kümmern würden, die Sie aus der Hive-Tabelle ausschließen möchten, ist die Verwendung von Option 2 wahrscheinlich ein Overkill, und Sie sollten die Verzeichnisstruktur korrigieren und eine Hive-Tabelle über dem Verzeichnis erstellen, das Dateien enthält, die Ihnen wichtig sind .
Wenn die Dateien, die Sie derzeit ausschließen, dem gleichen Format wie die anderen Dateien folgen (also alle Teil derselben Hive-Tabelle sein können), könnten Sie eine Abfrage schreiben, die alle Daten im Verzeichnis analysiert. Dann geh mit Option 2.
funktioniert nicht mit opencsvserde – thebluephantom