Hive Pig 反连接

Posted

技术标签:

【中文标题】Hive Pig 反连接【英文标题】:Hive Pig anti join 【发布时间】:2021-09-07 18:31:22 【问题描述】:

我正在尝试合并两个数据集:Eventsmortality by patientid。事件具有所有patientid,包括mortality 中的患者ID,但在mortality 中没有timestamplabel(始终等于1)。我想提取events 中的所有记录,而不是mortality 中的所有记录。

-- load events file
events = LOAD '../sample_test/sample_events.csv' USING PigStorage(',') AS (patientid:int, eventid:chararray, eventdesc:chararray, timestamp:chararray, value:float);

-- select required columns from events
events = FOREACH events GENERATE patientid, eventid, ToDate(timestamp, 'yyyy-MM-dd') AS etimestamp, value;

-- load mortality file
mortality = LOAD '../sample_test/sample_mortality.csv' USING PigStorage(',') as (patientid:int, timestamp:chararray, label:int);

mortality = FOREACH mortality GENERATE patientid, ToDate(timestamp, 'yyyy-MM-dd') AS mtimestamp, label;

--To display the relation, use the dump command e.g. DUMP mortality;

-- ***************************************************************************
-- Compute the index dates for dead and alive patients
-- ***************************************************************************
eventswithmort = JOIN events BY patientid, mortality BY patientid;-- perform join of events and mortality by patientid;
eventswithmort = FOREACH eventswithmort GENERATE events.patientid, events.eventid, events.etimestamp, events.value, mortality.mtimestamp, mortality.label;

aliveevents = FILTER eventswithmort BY mortality::label != 1;

我的问题是最后一行代码我应该使用label != 1 还是label is null?似乎我总是得到一个空数据集。

【问题讨论】:

【参考方案1】:
eventswithmort = FOREACH eventswithmort GENERATE events.patientid, events.eventid, events.etimestamp, events.value, mortality.mtimestamp, mortality.label;

不完全确定这是生成数据的语法,而不是 .你不应该使用 ::

如果您想要事件中的行而不是死亡率中的行,那么联接应该留在外部,猪默认是内部联接。

eventswithmort = JOIN events BY patientid LEFT OUTER, 死亡率 BY 耐心;

然后对于每个事件withmort,您可以按死亡率过滤::标签为空;

【讨论】:

以上是关于Hive Pig 反连接的主要内容,如果未能解决你的问题,请参考以下文章

hadoop是怎么存储大数据的

使用 PIG 加载 Hive 表的问题

大数据的Hadoop是做啥的?

仅当值不同时才更新 HBase 表

一起学Hadoop——实现两张表之间的连接操作

PIG 自动与默认 HDFS 连接,如何?