Hive ETL - 基于记录模式的分区数据

时间:2014-08-13 08:28:09

标签: hadoop hive etl

我将数据存储在HDFS中作为具有多行的文本文件。每行都有几条记录 可以组织为列。例如,线条如下所示

Columns     A       B      C     D   E  F   G
       9/05/2014  14:17 312118  235 44 111 100
       ...
       9/05/2014  14:27 312118  255 48 111 103

我可以创建一个架构并轻松地在Hive中加载所有这些行,但我真正想要的是 根据列" D"将它们聚集成小集合。值。我想要的是分区我的数据 一种方式,所有记录的值D = 235和所有记录在此行之后,直到我 找到D值等于255的行,成为一个单独的分区。

只是为了进一步澄清我需要解决的问题。考虑一下这个案子 textfile有以下记录:

Columns     A       B      C     D   E  F   G
       9/05/2014  14:17 312118  235 44 111 100
       9/05/2014  14:18 312118  200 44 111 100
       9/05/2014  14:19 312118  200 44 111 100
       9/05/2014  14:20 312118  201 44 111 100
         ... (several more records)
       9/05/2014  14:27 312118  255 48 111 103
       9/05/2014  14:28 312118  235 44 111 100
         ... (several more records)
       9/05/2014  14:58 312118  255 44 111 100

我希望以每个临时表的方式对数据进行分区 将保存一组以D值= 235开头并具有最后一个数据的数据 D值= 255的记录。在上面的例子中,理想情况下应该有2个表 使用以下值创建了temp1和temp2:

Temp1
      9/05/2014  14:17 312118  235 44 111 100
      9/05/2014  14:18 312118  200 44 111 100
      9/05/2014  14:19 312118  200 44 111 100
      9/05/2014  14:20 312118  201 44 111 100
        ... (several more records)
      9/05/2014  14:27 312118  255 48 111 103

Temp2
      9/05/2014  14:28 312118  235 44 111 100
        ... (several more records)
      9/05/2014  14:58 312118  255 44 111 100

我可以使用HiveQL做到这一点,还是有另一种方法来实现这个ETL过程?

2 个答案:

答案 0 :(得分:0)

假设数据位于Hive表中(您说您已经可以这样做),请少称它为t1

创建一个新的分区表,例如:
create table temp (a string,b string,c string,e string,f string,g string) partitioned by (d string)

然后以下列方式简单地将t1中的记录插入temp

insert overwrite table temp partition (d) select a,b,c,e,f,g,d from t1

就是这样。
对于d的每个新值,将在temp中创建一个分区,所有具有相同值d的记录将放入该分区。

答案 1 :(得分:0)

你需要在你的分区中提到D列。具有不同D值的所有数据都将存储在文件中。

HDFS中的文件类似于/ hdfspath> / D = 235,/ hdfspath> / D = 255

希望这就是你要找的东西