Как отобразить конкретную строку в файле HDFS, которая содержит специальную строку - PullRequest
0 голосов
/ 03 января 2019

У меня есть эти строки

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 string.

Я пытался так:

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

Но это не дает необходимого результата.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Если вы хотите выполнить этот поиск для небольшого количества файлов или не очень больших файлов, тогда должен работать следующий подход:


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

Однако, если вы выполняете этот поиск по сотням файлов, тогда ябудет использовать задание уменьшения карты или Streaming API для этого.Выше метод будет очень медленным для большого количества файлов.

0 голосов
/ 03 января 2019

grep можно использовать, если у вас ограниченный размер файлов, но он не масштабируется при наличии больших данных.

Если вы используете Hive, то вы можете создать таблицу Hive для этих данных и затем написатьHive Query для получения требуемой строки.

Например, в приведенном выше файле содержатся данные, в каждой строке по 5 значений, разделенных ,.Мы можем рассматривать у нас есть 5 столбцов - col1, col2, col3, col4 и col5 таблицы mytable.Данные будут представлены в виде:

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

После этого вы можете написать запрос, например:

Select * from mytable where col5 == '113424'

Вы можете написать задание MapReduce или использовать другой каркас / инструмент (например, Pig), которыйВам удобно.

Надеюсь, это поможет.

0 голосов
/ 03 января 2019

Подобно * nix, опция -ls выводит список файлов и каталогов по заданному пути, она не читает содержимое файла hdfs. См. документация оболочки файловой системы HDFS . Вероятно, вам нужна команда -cat:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...