在 hive 中创建外部表时,我可以将位置指向目录中的特定文件吗?

2024-04-01

我这样定义了一个表:

create external table PageViews (Userid string, Page_View string)
partitioned by (ds string)
row format as delimited fields terminated by ','
stored as textfile location '/user/data';

我不希望 /user/data 目录中的所有文件都用作表的一部分。我可以执行以下操作吗?

location 'user/data/*.csv'

克莫斯利说的是真的。截至目前,您无法有选择地选择某些文件作为 Hive 表的一部分。但是,有两种方法可以解决这个问题。

选项1:您可以将所有 csv 文件移动到另一个 HDFS 目录中,并在其上创建一个 Hive 表。如果它更适合您,您可以在当前目录中创建一个子目录(例如 csv)来存放所有 CSV 文件。然后,您可以在此子目录之上创建一个 Hive 表。请记住,在父目录顶部创建的任何 Hive 表都不会包含子目录中的数据。

选项2:您可以更改查询以使用名为的虚拟列INPUT__FILE__NAME.

您的查询将类似于:

SELECT 
   *
FROM
   my_table
WHERE
   INPUT__FILE__NAME LIKE '%csv';

这种方法的不良影响是,即使您只关心特定文件,Hive 查询也必须遍历目录中存在的整个数据。查询不会根据谓词过滤掉文件INPUT__FILE__NAME。它只会过滤掉不来自与谓词匹配的记录INPUT__FILE__NAME在映射阶段(随后过滤掉特定文件中的所有记录),但映射器也会在不必要的文件上运行。它会给你正确的结果,可能会有一些(可能很小)的性能开销。

这种方法的好处是,如果您的表中有多个文件,并且您希望能够在几次查询中查询该表(或其分区)中的所有文件以及其中的文件子集,则可以使用相同的 Hive 表。其他查询。您可以利用INPUT__FILE__NAME虚拟专栏来实现这一点。举个例子: 如果您的 HDFS 目录中有一个分区/user/hive/warehouse/web_logs/看起来像:

/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

假设您的表定义如下:

CREATE EXTERNAL TABLE IF NOT EXISTS web_logs_table (col1 STRING)
PARTITIONED BY (dt STRING)
LOCATION '/user/hive/warehouse/web_logs';

添加适当的分区后,您可以使用如下查询来查询分区中的所有日志:

SELECT
   *
FROM
   web_logs_table w
WHERE
   dt='2012-06-30';

但是,如果您只关心当天第一个小时的日志,则可以使用如下查询来查询第一个小时的日志:

SELECT
   *
FROM
   web_logs_table w
WHERE 
   dt ='2012-06-30'
   AND INPUT__FILE__NAME='00.log';

另一个类似的用例可能是包含来自不同域的 Web 日志的目录,并且需要分析不同域集上的日志的各种查询。查询可以使用以下方式过滤掉域INPUT__FILE__NAME虚拟专栏。

在上述两种用例中,为小时或域设置子分区也可以解决问题,而无需使用虚拟列。但是,可能存在一些设计权衡,要求您不创建子分区。在这种情况下,可以说,使用INPUT__FILE__NAME虚拟专栏是您最好的选择。

在 2 个选项之间做出决定:

这实际上取决于您的用例。如果您从不关心要从 Hive 表中排除的文件,那么使用选项 2 可能是一种矫枉过正,您应该修复目录结构并在包含您关心的文件的目录顶部创建一个 Hive 表。

如果您当前排除的文件遵循与其他文件相同的格式(因此它们都可以成为同一个 Hive 表的一部分),并且您可能会看到自己编写了一个查询来分析目录中的所有数据,那么请使用 Option 2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 hive 中创建外部表时,我可以将位置指向目录中的特定文件吗? 的相关文章

随机推荐