使用hive从文件中读取数据到表中
Reading data from files into tables using hive
在 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 中创建新文件夹和移动文件的权限。
更新。简而言之,仅当数据源为 folder(例如 /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)
Hive table 在文件夹级别工作,因此您不能将文件指定为有效位置。
也就是说,如果您在 /data/user_logs/ipdata_folder
中有多个文件,并且您只想将特定文件中的数据添加到 table(忽略其他文件),那么您您需要将这样的文件复制到另一个文件夹中,并将该替代文件夹指定为 table 定义中的位置。
然而,您说您没有创建文件夹或移动文件的权限。这是一个很大的限制......所以,我认为你唯一能做的就是保持 table 定义不变,这意味着所有数据文件都将添加到 table,并执行查询数据时对数据进行某种过滤。
在 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 中创建新文件夹和移动文件的权限。
更新。简而言之,仅当数据源为 folder(例如 /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)
Hive table 在文件夹级别工作,因此您不能将文件指定为有效位置。
也就是说,如果您在 /data/user_logs/ipdata_folder
中有多个文件,并且您只想将特定文件中的数据添加到 table(忽略其他文件),那么您您需要将这样的文件复制到另一个文件夹中,并将该替代文件夹指定为 table 定义中的位置。
然而,您说您没有创建文件夹或移动文件的权限。这是一个很大的限制......所以,我认为你唯一能做的就是保持 table 定义不变,这意味着所有数据文件都将添加到 table,并执行查询数据时对数据进行某种过滤。