在 HIVE 中增加现有的 row_sequence

Posted

技术标签:

【中文标题】在 HIVE 中增加现有的 row_sequence【英文标题】:Incrementing existing row_sequence in HIVE 【发布时间】:2013-12-05 16:31:45 【问题描述】:

我们正在尝试创建一个 HIVE 表,该表将包含一个用作唯一标识符的序列。 该表每天都会附加数据,我们希望保持序列运行。

对于初始加载,我们使用了 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence' 这对于未来的密钥显然是不够的,因为它总是从 0 开始。

我们考虑在每次运行之前从表中存储最大键,然后在每次加载操作时将其添加到序列中,但似乎无法使其在 HIVE 中工作。 我们面临的问题是我们无法将查询结果保存到变量中

理想情况下,它会执行以下操作(伪代码):

    create temporary function row_sequence as 'org.apache.hadoop.hive.contrib.udf.UDFRowSequence';

    将当前表的最大序列存储到一个变量中

    currentMaxSequence = "Select max(sequenceKey) as max from justAnyTable"

    将最大序列+当前序列附加到新行

    INSERT INTO TABLE anotherTable SELECT currentMaxSequence + row_sequence() as sk, name from (SELECT name from test limit 10) n;

任何想法如何做到这一点,特别是我们如何存储来自查询(一个值)的结果集并将其用于另一个,Hive 似乎不喜欢这种嵌套查询。

谢谢, 罗伊

【问题讨论】:

【参考方案1】:

您可以将 max 的结果存储在变量中。 尝试使用以下命令:

hive -e 'select concat('set maxValue=',t.maxvalue) from (select max(columnName) from tableName) t' >> /path/to/directory/storeMaxValue.sql

然后下一次运行,先运行这个命令:

hive -f /path/to/directory/storeMaxValue.sql;

您的变量现在在会话中可用。 但这件事对你没有帮助。 取而代之的是,您尝试将最大结果存储在一个表中,然后将该表的结果用作连续运行中的连接。

【讨论】:

感谢您的帮助!这可能就足够了,因为我们总是可以通过查找当前最大序列并使用它来启动会话。下周我会测试它,让你知道它是怎么回事【参考方案2】:

使用连接。

INSERT INTO TABLE anotherTable
SELECT n1.max + row_sequence() as sk, name 
from (SELECT name from test limit 10) n
join
(Select max(sequenceKey) as max from justAnyTable) n1

【讨论】:

感谢您的帮助!这与我们尝试过但无法正常工作的方法非常相似,可能是语法错误。下周我会用你的代码试试并更新答案。 您可能需要在创建临时函数之前添加hive-contrib jar。 jar 位于$HIVE_HOME/lib/,并以版本号结尾,例如,命令可能是:add jar /root/hive/hive-0.9.0/lib/hive-contrib-0.9.0.jar 原来这正是我们最终得到的结果。我希望找到一些更优雅的东西;),不管这被证实是一个有效的解决方案。知道 Hive 优化器是否知道只运行一次 max(sequenceKey) 函数吗?

以上是关于在 HIVE 中增加现有的 row_sequence的主要内容,如果未能解决你的问题,请参考以下文章

通过 Spark 将 csv 文件加载到现有的 HIVE 故事中

在 hive 的分区级别添加列

在 Hive 中执行 SQL 过程

更新配置单元表时出现问题

使用 Spark 查询 hive 表

Spark SQL与Hive的关系