Hive Pig 反连接
Posted
技术标签:
【中文标题】Hive Pig 反连接【英文标题】:Hive Pig anti join 【发布时间】:2021-09-07 18:31:22 【问题描述】:我正在尝试合并两个数据集:Events
和 mortality
by patientid
。事件具有所有patientid
,包括mortality
中的患者ID,但在mortality
中没有timestamp
和label
(始终等于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 反连接的主要内容,如果未能解决你的问题,请参考以下文章