我有这些行
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
但是它没有给出所需的结果。
答案 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}},col2
,col3
,col4
和col5
列。
数据将表示为:
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进行。上面的方法对于大量文件来说真的很慢。