使用配置单元将数据从文件读取到表中

时间:2015-04-15 18:40:49

标签: hive hiveql

在HDFS中,我有大量的文件和文件夹。我想使用Apache Hive将文件中的数据读入表中。 如果相应的数据位于文件夹中,我使用以下代码:

CREATE EXTERNAL TABLE IPRegions (
    -- some fields
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
    -- regexp
)
STORED AS TEXTFILE
LOCATION '/data/user_logs/ipdata_folder'; --this is a path to the folder with data

我应该如何更改此代码(我认为,只会更改最后2个字符串)如果相应的数据位于单个文件中?

P.S。我无权创建新文件夹并在HDFS中移动文件。

UPD。简而言之,只有当数据源是文件夹(例如/data/user_logs/ipdata_folder)时,我的代码才能正常工作。但是如果我想使用单个文件(例如/data/user_logs/ipdata_folder/logS.txt),我会发现错误:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:hdfs://bds11.vdi.mipt.ru:8020/data/user_logs/user_logs_S/logS.txt is not a directory or unable to create one)

1 个答案:

答案 0 :(得分:1)

Hive表在文件夹级别工作,因此您无法将文件指定为有效位置。

据说,如果你在/data/user_logs/ipdata_folder内有一个以上的文件而你只想在表格中添加特定文件中的数据(忽略其他文件),那么你需要复制将此类文件放入另一个文件夹,并将该备用文件夹指定为表定义中的位置。

尽管如此,您说您无权创建文件夹或移动文件。这是强烈的限制......所以,我认为你能做的唯一事情是保持表定义不变,这意味着所有的数据文件都将被添加到表中,并在数据时对数据执行某种过滤查询它。