使用 PIG 或 HIVE 从 CSV 中删除前两行

Posted

技术标签:

【中文标题】使用 PIG 或 HIVE 从 CSV 中删除前两行【英文标题】:Deleting first two rows from a CSV using PIG or HIVE 【发布时间】:2015-09-17 20:53:12 【问题描述】:

我有一个带有两个标题行的 CSV 文件。我想删除它们。如何删除 hive 或 PIG 中 CSV 文件的前两行?文件的前几行如下:

YEAR    QUARTER MONTH   DAY_OF_MONTH    DAY_OF_WEEK FL_DATE UNIQUE_CARRIER  AIRLINE_ID  CARRIER TAIL_NUM    FL_NUM  ORIGIN  ORIGIN_CITY_NAME    ORIGIN_STATE_ABR    ORIGIN_STATE_FIPS   ORIGIN_STATE_NM ORIGIN_WAC  DEST    DEST_CITY_NAME  DEST_STATE_ABR  DEST_STATE_FIPS DEST_STATE_NM   DEST_WAC    CRS_DEP_TIME    DEP_TIME    DEP_DELAY   DEP_DELAY_NEW   DEP_DEL15   DEP_DELAY_GROUP DEP_TIME_BLK    TAXI_OUT    WHEELS_OFF  WHEELS_ON   TAXI_IN CRS_ARR_TIME    ARR_TIME    ARR_DELAY   ARR_DELAY_NEW   ARR_DEL15   ARR_DELAY_GROUP ARR_TIME_BLK    CANCELLED   CANCELLATION_CODE   DIVERTED    CRS_ELAPSED_TIME    ACTUAL_ELAPSED_TIME AIR_TIME    FLIGHTS DISTANCE    DISTANCE_GROUP  CARRIER_DELAY   WEATHER_DELAY   NAS_DELAY   SECURITY_DELAY  LATE_AIRCRAFT_DELAY
YEAR    QUARTER MONTH   DAY_OF_MONTH    DAY_OF_WEEK FL_DATE UNIQUE_CARRIER  AIRLINE_ID  CARRIER TAIL_NUM    FL_NUM  ORIGIN  ORIGIN_CITY_NAME    ORIGIN_STATE_ABR    ORIGIN_STATE_FIPS   ORIGIN_STATE_NM ORIGIN_WAC  DEST    DEST_CITY_NAME  DEST_STATE_ABR  DEST_STATE_FIPS DEST_STATE_NM   DEST_WAC    CRS_DEP_TIME    DEP_TIME    DEP_DELAY   DEP_DELAY_NEW   DEP_DEL15   DEP_DELAY_GROUP DEP_TIME_BLK    TAXI_OUT    WHEELS_OFF  WHEELS_ON   TAXI_IN CRS_ARR_TIME    ARR_TIME    ARR_DELAY   ARR_DELAY_NEW   ARR_DEL15   ARR_DELAY_GROUP ARR_TIME_BLK    CANCELLED   CANCELLATION_CODE   DIVERTED    CRS_ELAPSED_TIME    ACTUAL_ELAPSED_TIME AIR_TIME    FLIGHTS DISTANCE    DISTANCE_GROUP  CARRIER_DELAY   WEATHER_DELAY   NAS_DELAY   SECURITY_DELAY  LATE_AIRCRAFT_DELAY
2015    1   1   1   4   2015-01-01  AA  19805   AA  N787AA  1   JFK New York     NY NY  36  New York    22  LAX Los Angeles  CA CA  6   California  91  900 855 -5  0   0   -1  0900-0959   17  912 1230    7   1230    1237    7   7   0   0   1200-1259   0       0   390 402 378 1   2475    10          
2015    1   1   2   5   2015-01-02  AA  19805   AA  N795AA  1   JFK New York     NY NY  36  New York    22  LAX Los Angeles  CA CA  6   California  91  900 850 -10 0   0   -1  0900-0959   15  905 1202    9   1230    1211    -19 0   0   -2  1200-1259   0       0   390 381 357 1   2475    10          

【问题讨论】:

你能简单地删除所有以“YEAR”开头的行吗? 非常感谢您的回答...您能提供一下代码吗?是在 PIG 还是 HIVE 中? ***.com/questions/17810537/… 搜索“PIG 从表中删除行” 【参考方案1】:

试试这个。根据您的要求修改它:我已经为每一行加载了一行,您也可以为每个字段定义列。

a = LOAD 'file.csv' using TextLoader() as (line:chararray); b = FILTER a by SUBSTRING(line,0,4) != 'YEAR'; dump b;

或者使用 Hive:

 Create table temp ( Col1 string, col2 int and so on) 
row format delimited fields terminated BY '\t' lines terminated BY '\n'
tblproperties("skip.header.line.count"="2");

LOAD data 'file path' into table temp;

这将删除前 2 行并加载剩余的记录

【讨论】:

感谢 Harish 的回答....但是变量 b 只返回那些以 'YEAR' 开头的行。所以我以下面给定的方式写...仍然不起作用...谁能帮忙.. b = FILTER a by SUBSTRING(line,0,4) != 'YEAR';按照我的说法,它应该给出结果集,除了带有'YEAR'的行...... 嗨 Dipayan.. 我已更新以过滤不等于 YEAR。它对我来说很好。你能发布你正在尝试的代码吗? 1st.grunt> d = FILTER a by SUBSTRING(line,0,4) != 'YEAR'; 2nd.grunt> 使用 PigStorage (',','-schema') 将 d 存储到 '/user/hadoop/abp_final5' 中; 3rd.hduser@greycampus:~$ hadoop fs -getmerge /user/hadoop/csvoutput_final ./abp_final_try.csv;这些是我一步一步的代码...... 能否请您提供关于 a 和 d 的转储并在​​此处发布每个示例的结果? 我已经添加了另一种方法来对 hive 做同样的事情。如果需要,请尝试该选项。

以上是关于使用 PIG 或 HIVE 从 CSV 中删除前两行的主要内容,如果未能解决你的问题,请参考以下文章

Pig 使用 LOAD 覆盖配置单元中的数据

通过 pig 脚本删除 hive 表分区

使用 Hive 或 Pig 在字段中查找重复次数最多的值

删除同一目录中多个CSV文件中的前两列和最后一列

使用预先排序的数据加速 Hive 或 Pig 聚合

使用 pig 从 csv 文件中读取数据