带有空值的猪连接

Posted

技术标签:

【中文标题】带有空值的猪连接【英文标题】:Pig Join with null values 【发布时间】:2012-09-28 05:23:51 【问题描述】:

在实现How to optimize a group by statement in PIG latin? 提供的解决方案时,我发现所有具有一个空列的行都被删除,这是 Pig 中的预期行为。我想知道下面的代码是否可以工作?

A = B join by ( Bcol1 is null?'UNK',Bcol2 is null?'UNK',Bcol2 is null?999),
C join by ( Ccol1 is null?'UNK',Ccol2 is null?'UNK',Ccol2 is null?999)

我遇到了一些解析错误。

【问题讨论】:

【参考方案1】:

PIG 是一种数据流脚本语言,添加额外的 FOREACH GENERATE 来修复 null 不会导致额外的 map reduce 作业。

B = foreach B generate ....., (Bcol1 is null) ? 'UNK' : Bcol1 as Bcol1, (Bcol2 is null) ? 'UNK' : Bcol2 as Bcol2, (Bcol3 is null) ? 999 : Bcol3;
C = foreach C generate ....., (Ccol1 is null) ? 'UNK' : Ccol1 as Ccol1, (Ccol2 is null) ? 'UNK' : Ccol2 as Ccol2, (Ccol3 is null) ? 999 : Ccol3;
A = join B by (Bcol1, Bcol2, Bcol3), C by (Ccol1, Ccol2, Ccol3);

【讨论】:

感谢 Alexejpab 的回复,我确实以同样的方式在我这边实现了,但是唯一的缺点是它本质上会将值从 null 更改为某个确定性值,这可能会呈现为值..但我认为由于连接中没有 NVL 功能.. 这是要走的路.. 你总是可以做"(Bcol1 is null) ? 'UNK' : Bcol1 as JOIN_Bcol1",所以你用改变的空值复制列并在加入后丢弃它们

以上是关于带有空值的猪连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sqlite 中选择带有空值的尾部?

具有空值的完全外连接自身

返回带有零而不是空值的 Access 记录集

带有空值的 Seq[(Int,Int)] 隐式转换为 DataFrame

带有 where 条件的 PL/SQL 更新查询作为带有一些空值的选择查询

在 p:selectOneMenu 中使用带有 null/空值的“请选择”f:selectItem