Мне нравятся мощные фильтры, предоставляемые JQ
(Doc).
Публичный API Twitter предоставляет хорошо отформатированные файлы json. У меня есть доступ к большому их количеству, и у меня есть доступ к кластеру Hadoop. Там я решил вместо того, чтобы загружать их в Pig
с помощью Elephantbird
, попробовать JQ
в стриминге маппера, чтобы посмотреть, будет ли он быстрее.
Вот мой последний запрос:
nohup hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.5.1.jar\
-files $HOME/bin/jq \
-D mapreduce.map.memory.mb=2048\
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
-mapper "./jq --raw-output 'select((.lang == \"en\") and (.entities.hashtags | length > 0)) | .entities.hashtags[] as \$tags | [.id_str, .user.id_str, .created_at, \$tags.text] | @csv'" \
-reducer NONE \
-input /path/to/input/*.json.gz \
-output /path/to/output \
&
Я распространяю свой локальный исполняемый файл jq
на каждый вычислительный узел и говорю им, чтобы они запускали с ним мою команду для их потока stdin
.
Запрос достаточно длинный, поэтому я столкнулся с проблемами цитирования и форматирования в bash
и JQ
.
Я хотел бы написать что-то вроде этого:
nohup hadoop jar $HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.5.1.jar\
-files $HOME/bin/jq,$PROJECT_DIR/cmd.jq \
-D mapreduce.map.memory.mb=2048\
-D mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec \
-mapper "./jq --raw-output --run-cmd-file=cmd.jq" \
-reducer NONE \
-input /path/to/input/*.json.gz \
-output /path/to/output \
&
где я могу просто поместить свою команду в файл, отправить ее на вычислительные узлы и вызвать с опцией.