Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 配置单元:基于相邻行合并或标记多行_Hive - Fatal编程技术网

Hive 配置单元:基于相邻行合并或标记多行

Hive 配置单元:基于相邻行合并或标记多行,hive,Hive,我有下表,希望基于相邻行合并多行 输入 预期产量 其逻辑是,由于第一行的“abc”与“abcd”相连,第二行的“abcd”与“abcde”相连,依此类推,因此“abc”、“abcd”、“abcde”、“abcdef”被连接并放在一个数组中。其余的行也同样如此。连接的相邻行数是任意的 问题是如何在没有任何UDF的情况下使用配置单元脚本来实现这一点。我必须使用Spark进行这种类型的操作吗?非常感谢 我的一个想法是首先将行标记为 如何仅使用配置单元脚本执行此操作?这是一个在配置单元或SPARK

我有下表,希望基于相邻行合并多行

输入

预期产量

其逻辑是,由于第一行的“abc”与“abcd”相连,第二行的“abcd”与“abcde”相连,依此类推,因此“abc”、“abcd”、“abcde”、“abcdef”被连接并放在一个数组中。其余的行也同样如此。连接的相邻行数是任意的

问题是如何在没有任何UDF的情况下使用配置单元脚本来实现这一点。我必须使用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“放入标签”的建议?我可以把它作为实现目标的中间步骤。谢谢。我正在查另一件事。它看起来像图形,但不是真的。让我尽快回复你。这在过去是有效的,但很麻烦。蜂巢,没有非程序的那么确定。非常感谢。我会看一看。还有什么进一步的吗?请看下面我自己的答案。