过滤 PIG LATIN 脚本中的列在为空的单元格上插入来自其他列的数据

Posted

技术标签:

【中文标题】过滤 PIG LATIN 脚本中的列在为空的单元格上插入来自其他列的数据【英文标题】:Filtering columns on PIG LATIN script inserts data from other columns on cells that are null 【发布时间】:2019-03-07 21:56:20 【问题描述】:

好的,我已经为此完成了所有的谷歌搜索和文档阅读,但仍然找不到解决方案。

我正在从这里下载一个 CSV 文件导出:Traffic Crashes Chicago

我编写了一个 PIG 脚本,它将过滤掉我不想要的列,以便输出只包含所需的列。我遇到的问题是,当我使用 (FOREACH GENERATE) PIG 时,如果该字段为空,PIG 将从上一列中获取数据并将其插入到以下字段中。

我不想过滤掉空值,因为我需要这个数据集中的每一行。如何防止 PIG 插入不正确的数据,或者如果 PIG 遇到空值而不是从以前的列中插入内容,有没有办法插入“”?

只是几个解释:

我正在 foreach 上创建某种模式('alias' 为 'alias'),因为如果我不这样做,输出将删除空值上的逗号,并且由于我将要导入表格,因此表格将被弄乱这到 SQL Server 中,我需要所有 PK 和 FK 都存在才能匹配其他表。

我使用 DISTINCT 是为了将输出保存到一个文件中,否则输出将分散到多个文件中。

这是我运行脚本后得到的输出:

Output of PIG script

这是我的 PIG 脚本:

A = LOAD 'Traffic_Crashes.csv' 
USING PigStorage (',') 
AS (RD_NO: chararray, CRASH_DATE_EST_I: chararray, CRASH_DATE: chararray, POSTED_SPEED_LIMIT: chararray, TRAFFIC_CONTROL_DEVICE: chararray, DEVICE_CONDITION: chararray, WEATHER_CONDITION: chararray, LIGHTING_CONDITION: chararray, FIRST_CRASH_TYPE: chararray, TRAFFICWAY_TYPE: chararray, LANE_CNT: chararray, ALIGNMENT: chararray, ROADWAY_SURFACE_COND: chararray, ROAD_DEFECT: chararray, REPORT_TYPE: chararray, CRASH_TYPE: chararray, INTERSECTION_RELATED_I: chararray, NOT_RIGHT_OF_WAY_I: chararray, HIT_AND_RUN_I: chararray, DAMAGE: chararray, DATE_POLICE_IFIED: chararray, PRIM_CONTRIBUTORY_CAUSE: chararray, SEC_CONTRIBUTORY_CAUSE: chararray, STREET_NO: chararray, STREET_DIRECTION: chararray, STREET_NAME: chararray, BEAT_OF_OCCURRENCE: chararray, PHOTOS_TAKEN_I: chararray, STATEMENTS_TAKEN_I: chararray, DOORING_I: chararray, WORK_ZONE_I: chararray, WORK_ZONE_TYPE: chararray, WORKERS_PRESENT_I: chararray, NUM_UNITS: chararray, MOST_SEVERE_INJURY: chararray, INJURIES_TOTAL: chararray, INJURIES_FATAL: chararray, INJURIES_INCAPACITATING: chararray, INJURIES_NON_INCAPACITATING: chararray, INJURIES_REPORTED__EVIDENT: chararray, INJURIES_NO_INDICATION: chararray, INJURIES_UNKNOWN: chararray, CRASH_HOUR: chararray, CRASH_DAY_OF_WEEK: chararray, CRASH_MONTH: chararray, LATITUDE: chararray, LONGITUDE: chararray, LOCATION: chararray);

B = FOREACH A GENERATE RD_NO as RD_NO, CRASH_DATE as CRASH_DATE, PRIM_CONTRIBUTORY_CAUSE as PRIM_CONTRIBUTORY_CAUSE, MOST_SEVERE_INJURY AS MOST_SEVERE_INJURY;

C = DISTINCT D;

STORE C INTO 'crashFilter_Output/' USING PigStorage (',');

感谢所有阅读本文的人,我对此非常陌生,这是一个学校项目。

【问题讨论】:

【参考方案1】:

请尝试使用 CSVLoader。

DEFINE CSVLoader org.apache.pig.piggybank.storage.CSVLoader();
A = LOAD 'Traffic_Crashes.csv' USING CSVLoader() AS (RD_NO: char ...

这里的问题是 PigStorage 不能识别带引号的字符串。像

这样的字段
"OVER $1,500"

在 PigStorage 中被视为两个字段,从而导致您的输出发生意外变化。

【讨论】:

就是这样!!我不敢相信它奏效了。非常感谢。我怀疑 pig 无法区分用于分隔字段的逗号和用于处理文件的字段内的逗号。我不知道 CSVLoader 存在。谢谢!

以上是关于过滤 PIG LATIN 脚本中的列在为空的单元格上插入来自其他列的数据的主要内容,如果未能解决你的问题,请参考以下文章

SQL:如何在 B 列不为空的情况下使用“100”更新 A 列

在 PySpark 数据框中添加可为空的列

Pig Latin 在一个 FILTER 语句中使用两个数据源

Pig Latin 中的 AVG() 函数问题

Store 命令中的 Pig Latin 参数

处理 PIG Latin 中的重复记录