我有一个用例,我需要使用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表。我不知道我怎么做。任何帮助或线索都将受到高度赞赏。
答案 0 :(得分:0)
尝试以下方法:
使用随机会话ID:
create external table staging (a string, b string, c string) location 'xyz';
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);
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;
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。