如何将多个文本文件合并到Hive表中

时间:2018-04-27 01:42:38

标签: sql hadoop hive

我目前正在尝试编写Hive脚本以获取目录路径并生成将路径中的所有不同文件组合在一起的Hive表。我已经找到了如何加载文件,因为我知道它们的直接路径,但是如何在不知道所有文件路径的情况下执行此操作?

如果我知道给定目录的路径,/ combine:

,我就会这样做
LOAD DATA INPATH '/combine/file1.txt' INTO TABLE tablename;
LOAD DATA INPATH '/combine/file2.txt' INTO TABLE tablename;

但如果你不知道文件路径,只知道目录?

,你会得到相同的结果

2 个答案:

答案 0 :(得分:0)

您可以使用外部Hive表。

在HDFS上创建一个文件夹并在其中加载这两个文件:

#!/bin/ksh
while read rec
 do
    while read line
    do
        firstname=`echo $line | sed -n -e 's/^.*\(full-name\)/\1/p' | cut -f3 -d'"'`
        id=`echo $line | sed -n -e 's/^.*\(id\)/\1/p' | cut -f3 -d'"'`
        echo "${firstname}'|'${id}"
        done < `echo $rec | nawk 'gsub("}}}}", "\n")' | sed 's/{"results"//g'`

done < /var/tmp/Cloud_test.txt

或者,指定从中加载所有文件的目录:

hadoop fs -mkdir /hive-data
hadoop fs -put file1.txt /hive-data/file1.txt
hadoop fs -put file2.txt /hive-data/file2.txt

验证文件是否已正确加载:

hadoop fs -put directory-with-files/* /hive-data/

在Hive中创建外部表并参考HDFS位置:

(更改架构,字段和行分隔符以匹配您的数据文件。)

hadoop fs -ls /hive-data

验证Hive中的数据:

CREATE EXTERNAL TABLE tablename
(
    id INT,
    desc STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
LOCATION 'hdfs:///hive-data';

答案 1 :(得分:0)

只需*符号就可以将e目录下的所有文件加载到表中。

LOAD DATA INPATH '/combine/*' INTO TABLE tablename;