基于Hive的数据仓库任务 - 向记录添加序列号

时间:2016-07-29 11:49:31

标签: hadoop hive

我有一个用例,我需要使用Hive实现基于SQL的数据仓库活动。

该软件会生成一堆csv文件。当它转换为SQL表时,为每个csv文件分配一个名为session的唯一id,并将其加载到SQL表中。让我们说,我在csv文件中有3列。我将在SQL表中有四列,其中第一列代表会话。这意味着,存储在第一个csv文件中的值将使用sessios id' 1'写入SQL表中,并且第二个csv文件中的值将附加到SQL表中,其中会话ID为' 2'等等。

在Hive中,

我将这些csv文件存储在hdfs目录中,并希望创建一个带有表示会话ID的附加列的hive表。我不知道我怎么做。任何帮助或线索都将受到高度赞赏。

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

使用随机会话ID:

  • 在源数据集之上创建外部表:

create external table staging (a string, b string, c string) location 'xyz';

  • 为每行分配唯一ID:

insert into table destination as select reflect("java.util.UUID", "randomUUID") AS session_id, s.* from staging;

使用序列号作为会话ID:

  • 在源数据集之上创建外部表:

create external table staging (a string, b string, c string) location 'xyz';

  • 首次加载数据:

CREATE TABLE IF NOT EXISTS max_session_id (session_id int);

  • 在每条记录中附加序列ID:

insert into table destination select cast(coalesce(t.session_id,0) + row_number() over () as INT) as session_id, t1.* from max_session_id t join destination t1 on 1=1;

  • 在单独的表格中维护最大会话ID:

DROP TABLE IF EXISTS tmp_max_session_id; CREATE TABLE tmp_max_session_id AS SELECT COALESCE(MAX(session_id), 0) AS session_id FROM destination;

INSERT OVERWRITE TABLE max_session_id SELECT * FROM tmp_max_session_id;

如果要为每个文件标记相同的会话ID然后将每个文件添加为分区,则可以在单独的表中存储reflect(“java.util.UUID”,“randomUUID”)或max_session_id,同时添加使用新生成的分区session_id作为分区ID。