如何在HDFS文件中显示包含特殊字符串的特定行

时间:2019-01-03 14:34:36

标签: hadoop

我有这些行

DIS_CD_RLT_PSE,D,,177959,10.425719262087393
DIS_CD_RLT_PSE,E,,811061,47.5159687929684
DIS_CD_RLT_PSE,I,,113424,6.6449394612410755
DIS_CD_RLT_PSE,M,,404023,23.66966758313058
DIS_CD_RLT_PSE,P,,28083,1.6452411737377726
DIS_CD_RLT_PSE,U,,142155,8.32814368310697
DIS_CD_RLT_PSE,Z,,30218,1.7703200437278073

位于此处

/hdfs/data/t11/t111/t1/t/z/InterfacePublique/

我需要一个hadoop命令,该命令只能显示以下行:

DIS_CD_RLT_PSE,I,,113424,6.6449394612410755

给出 DIS_CD_RLT_PSE I 字符串。

我尝试过这样:

Hadoop fs -ls /hdfs/data/t11/t111/t1/t/z/InterfacePublique/ | grep DIS_CD_RLT_PSE | grep I

但是它没有给出所需的结果。

3 个答案:

答案 0 :(得分:2)

类似于* nix,-ls选项列出给定路径中的文件和目录,它不读取hdfs文件内容。参见HDFS file system shell documentation。 您可能正在寻找的命令是-cat

$ hdfs dfs -cat /hdfs/data/t11/t111/t1/t/z/InterfacePublique/* | grep "DIS_CD_RLT_PSE.*I"

答案 1 :(得分:1)

如果文件大小有限,但是在大数据时无法缩放,则可以使用grep。

如果使用Hive,则可以在此数据上创建Hive表,然后编写Hive查询以检索所需的行。

例如,上面的文件中的数据每行都有5个值,并用,分隔。 我们可以认为我们有5列-表col1的{​​{1}},col2col3col4col5列。 数据将表示为:

mytable

之后,您可以编写一个查询:

----------------------------------------------------------------
col1           | col2 | col3 |    col4   | col5                |    
----------------------------------------------------------------
DIS_CD_RLT_PSE  | Z   | NULL |   30218   | 1.7703200437278073  |
----------------------------------------------------------------

您可以编写MapReduce作业,也可以使用自己喜欢的其他框架/工具(例如Pig)。

希望这会有所帮助。

答案 2 :(得分:0)

如果您要对少量文件或不是很大的文件执行此搜索,则以下方法应该可行:


hadoop fs -ls /technology/dps/real | awk '{print $8}' | while read f; do hdfs dfs -cat $f | grep -q DIS_CD_RLT_PSE && echo $f; done

但是,如果您要搜索100个文件,则可以使用map-reduce作业或Streaming API进行。上面的方法对于大量文件来说真的很慢。