Hive 配置单元:基于相邻行合并或标记多行
我有下表,希望基于相邻行合并多行 输入 预期产量 其逻辑是,由于第一行的“abc”与“abcd”相连,第二行的“abcd”与“abcde”相连,依此类推,因此“abc”、“abcd”、“abcde”、“abcdef”被连接并放在一个数组中。其余的行也同样如此。连接的相邻行数是任意的 问题是如何在没有任何UDF的情况下使用配置单元脚本来实现这一点。我必须使用Spark进行这种类型的操作吗?非常感谢 我的一个想法是首先将行标记为Hive 配置单元:基于相邻行合并或标记多行,hive,Hive,我有下表,希望基于相邻行合并多行 输入 预期产量 其逻辑是,由于第一行的“abc”与“abcd”相连,第二行的“abcd”与“abcde”相连,依此类推,因此“abc”、“abcd”、“abcde”、“abcdef”被连接并放在一个数组中。其余的行也同样如此。连接的相邻行数是任意的 问题是如何在没有任何UDF的情况下使用配置单元脚本来实现这一点。我必须使用Spark进行这种类型的操作吗?非常感谢 我的一个想法是首先将行标记为 如何仅使用配置单元脚本执行此操作?这是一个在配置单元或SPARK
如何仅使用配置单元脚本执行此操作?这是一个在配置单元或SPARK中不受支持的CONNECT BY查询示例,与DB2或ORACLE等不同
您可以使用Spark Scala模拟这样的查询,但这远远不够方便。在我看来,添加标记意味着问题的相关性较低。下面是一个使用配置单元脚本获取中间表的方法
drop table if exists step1;
create table step1 STORED as orc as
with src as
(
select split(u.tmp,",")[0] as node_1, split(u.tmp,",")[1] as node_2
from
(select stack (7,
"abc,abcd",
"abcd,abcde",
"abcde,abcdef",
"bcd,bcde",
"bcde,bcdef",
"cdef,cdefg",
"def,defg"
) as tmp
) u
)
select node_1, node_2, if(node_2 = lead(node_1, 1) over (order by node_1), 1, 0) as tag, row_number() OVER (order by node_1) as row_num
from src;
drop table if exists step2;
create table step2 STORED as orc as
SELECT tag, row_number() over (ORDER BY tag) as row_num
FROM (
SELECT cast(v.tag as int) as tag
FROM (
SELECT
split(regexp_replace(repeat(concat(cast(key as string), ","), end_idx-start_idx), ",$",""), ",") as tags --repeat the row number by the number of rows
FROM (
SELECT COALESCE(lag(row_num, 1) over(ORDER BY row_num), 0) as start_idx, row_num as end_idx, row_number() over (ORDER BY row_num) as key
FROM step1 where tag=0
) a
) b
LATERAL VIEW explode(tags) v as tag
) c ;
drop table if exists step3;
create table step3 STORED as orc as
SELECT
a.node_1, a.node_2, b.tag
FROM step1 a
JOIN step2 b
ON a.row_num=b.row_num;
最后一张桌子看起来像
select * from step3;
+---------------+---------------+------------+
| step3.node_1 | step3.node_2 | step3.tag |
+---------------+---------------+------------+
| abc | abcd | 1 |
| abcd | abcde | 1 |
| abcde | abcdef | 1 |
| bcd | bcde | 2 |
| bcde | bcdef | 2 |
| cdef | cdefg | 3 |
| def | defg | 4 |
+---------------+---------------+------------+
第三列可用于收集节点对 有没有关于如何使用Hive“放入标签”的建议?我可以把它作为实现目标的中间步骤。谢谢。我正在查另一件事。它看起来像图形,但不是真的。让我尽快回复你。这在过去是有效的,但很麻烦。蜂巢,没有非程序的那么确定。非常感谢。我会看一看。还有什么进一步的吗?请看下面我自己的答案。