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

问题描述 投票:0回答:1

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

我从这里下载CSV文件导出:Traffic Crashes Chicago

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

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

只是几个解释:

我在foreach上创建了一种模式('别名'作为'别名'),因为如果我不输出将删除空值上的逗号,并且表格将被搞砸,因为我要将它导入SQL服务器和我需要存在所有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 (',');

谢谢任何读过这篇文章的人,我是一个超级新人,这是一个学校项目。

sql-server apache-pig
1个回答
0
投票

请尝试使用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中的两个字段,从而导致输出意外转换。

© www.soinside.com 2019 - 2024. All rights reserved.