arrays - 如何从 Hive 中的两个集合创建一个集合
问题描述
我想从来自两个不同表的列中的元素创建一个集合。对于第一个表table1
,我想根据第一列的值对第二列的元素进行分组;
SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID
我得到这样的东西:
|Id|l|
|1RT|[ab,a1,b5,....]|
|xRT|[c5,g2,l1,....]|
对于第二个表,我想从给定列中选择不同的元素(没有任何条件),并将它们与从table1
.
SELECT collect_set(ind) AS d FROM table2
我得到:
|d|
|[xy, xz, e1 ,...]|
我想通过合并d
到每个输出来合并两个输出l
。我尝试以下代码:
SELECT Id, array(l,d) AS a from(SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID) AS t1 cross join (SELECT collect_set(ind) AS d FROM table2) AS t2
但是我在一个数组中得到了两组:
|Id|a|
|1RT|[[ab,a1,b5,....],[xy, xz, e1 ,...]]|
|xRT|[[c5,g2,l1,....],[xy, xz, e1 ,...]]|
我想买一套;像这样的东西:
|Id|a|
|1RT|[ab,a1,b5,....,xy, xz, e1 ,...]|
|xRT|[c5,g2,l1,....,xy, xz, e1 ,...]|
我能怎么做?(我使用了 collect_set 但它不起作用)。
有任何想法吗?
解决方案
解决方案是使用砖房CombineUniqueUDAF
或CombineUDAF
:
- 从https://github.com/klout/brickhouse克隆(或分叉)repo
- 从命令行运行“mvn package”。
- 将 jar“target/brickhouse-.jar”添加到您的 HIVE_AUX_JARS_FILE_PATH,或使用“add jar”命令从 Hive CLI 将其添加到分布式缓存。
他们也有一些预建的 jars 供下载。
然后创建临时函数并在查询中使用它(连同之前的 ADD JAR 命令,提供正确的 jar 名称):
ADD JAR /path/to/jar/brickhouse-<version number>.jar;
CREATE TEMPORARY FUNCTION combine_unique AS 'brickhouse.udf.collect.CombineUniqueUDAF';
SELECT Id, combine_unique(l,d) AS a
from(SELECT Id, collect_set(lib) AS l FROM table1 WHERE (Id LIKE '%RT') GROUP BY ID) AS t1
cross join (SELECT collect_set(ind) AS d FROM table2) AS t2
推荐阅读
- travis-ci - Travis CI 构建矩阵可以“缩短”吗?
- ruby-on-rails - AWS DocumentDB 与 Ruby on Rails 和 Angular JS 的兼容性
- matlab - 使用两个范围对象对 2 级 numpy 数组进行切片
- javascript - 使用 URL 路由将状态参数传递到 AngularJS 中的新选项卡,而不显示在 url 中
- github - 在 GitHub 中,我关闭了一个错误的拉取请求,但它也关闭了我的分支,如何解决?
- ios - 使用字符串变量设置导航栏标题
- java - RecyclerView 中的属性动画
- mongodb - Spring Boot + Mongodb:文件上传 RESTFUL Web 服务
- php - 更改现有字段的定义在另一台服务器上不起作用
- ios - 我可以制作类似 ExpressibleByKeyPathLiteral 的东西吗?