
en Swoop tenemos muchos terabytes de datos JSON como MongoDB, Redis, ElasticSearch, / Hadoop HDFS y incluso Amazon Redshift. Mientras que las representaciones internas son típicamente no JSON pero BSON, MsgPack o codificaciones del nativas, cuando llegue el momento para mover grandes cantidades de datos para su fácil procesamiento ad hoc a menudo termino usando JSON y su primo mayor, JSONlines. Este post es sobre lo que puede rápidamente hacer con este tipo de datos de la línea de comandos.
ha habido un marcado aumento en el número de herramientas potente y robustas para la validación y manipulación de JSON y JSONlines de la línea de comandos de herramientas de la línea de comandos de JSON(lines) mejor. Mis favoritos son:
-
jq
: documentos de un procesador de corriente sorprendentemente rápido, basadas en C para JSON con un lenguaje fácil y potente. Pensar en él como sed y awk para JSON pero sin la sintaxis de la década de 1970. Tareas simples son triviales. Tareas de gran alcance son posibles. La sintaxis es intuitiva. Revisa el manual y tutorial. Debido a su velocidad y orientación de la corriente, jq es más natural cuando se procesan grandes cantidades de datos de JSONlines. Si quiere empujar los límites de lo que es sano hacerlo en la línea de comandos que son condicionales, variables y UDF. -
subrayado-cli
: esto es la navaja suiza para manipular JSON en la línea de comandos. Basado en Node.js, es compatible con JavaScript y CoffeeScript expresiones primitivas programación funcionales incorporados de la biblioteca de underscore.js, relativamente fácil salto de JSON a través de json:select y mucho más. Esto también es la mejor herramienta para la depuración de datos JSON a causa de la multitud de formatos de salida. Un plus especial en mi libro es ese subrayado-cli MsgPack, que utilizamos en flujos en tiempo real y un interior con restricciones de memoria caché. -
jsonpath
: aplicación basada en Ruby de JSONPath con una herramienta de línea de comandos correspondiente. Speedy no es pero es excelente cuando quieres JSONPath compatibilidad o puede volver a utilizar expresiones existentes. Hay algunas características aseados como árbol basada en patrones reemplazar operaciones. -
json
(también conocido como,jsontool
): otra herramienta basada en Node.js. No tan rico como subrayado-cli, pero tiene un par de características en ocasiones útiles tienen que ver con fusión y agrupación de los documentos. Esta herramienta también tiene un modo sólo validación simple, conveniente.
tenga en cuenta que puede modificar/ampliar datos JSON con estas herramientas, no solo transformarlo. jsontool puede editar documentos en lugar de la línea de comandos, algo que puede ser útil para, por ejemplo, actualizar rápidamente propiedades en archivos de configuración JSON.
64 bits (BIGINT) números
y JSON JSON ha indefinido (como en la específica de la implementación) semántica a la hora de tratar con enteros de 64 bits. El problema surge del hecho de que JavaScript no tiene este tipo de datos. Hay bibliotecas de Python, Ruby y Java JSON que no tienen ningún problema con números enteros de 8 bytes pero sería sospechoso de cualquier aplicación de Node.js. Si tienes este tipo de datos, prueba los casos de borde con la herramienta de elección.
validación de JSONlines y limpieza
hay veces cuando no se logra JSONlines datos limpiar. Puede incluir mensajes de error o una mezcla de salida STDOUT y STDERR (Heroku es notorio para algo). En esos momentos, es bueno saber cómo validar rápidamente y limpiar un archivo grande de JSONlines.
para limpiar la entrada, podemos usar un conjuro de sed simple que elimina todas las líneas que no comienzan con [
y {
, el comienzo de una matriz JSON o el objeto. Es difícil pensar en un comando de exportar a granel o script que salidas tipos JSON primitivos. Para validar las líneas restantes, podemos filtrar con jq y el tipo del objeto raíz de la salida.
cat data.jsonlines | sed ' / ^ [^ [{}] / d' > clean_data.jsonlines cat clean_data.jsonlines | jq 'tipo' >/dev/null
Esto va a generar en STDERR de salida con la línea y columna de cualquier JSON mal.
bastante impresión JSON
cada uno tiene su forma favorita para imprimir bastante JSON. Mina utiliza la salida predeterminada de jq porque viene en color y porque facilita profundizar en la estructura de datos. Vamos a usar la API de GitHub como ejemplo aquí.
repositorios # de lista de Swoop en GitHub API = 'https://api.github.com/users/swoop-inc/repos' alias swoop_repos = "curl $API" impresión bonita # la lista de repos de Swoop en GitHub en swoop_repos de color | JQ '.'
arrays JSON a JSONlines
GitHub nos da una matriz de objetos de repositorio pero vamos a decir que queremos JSONlines en su lugar para preparar la salida de API para la entrada en MongoDB vía mongoimport. – Compacto es perfecto para la salida de JSONlines opción de jq.
repos de swoop # como JSONlines swoop_repos | JQ - c '. []'
. []
filtro descompone una serie de entradas en entradas individuales.
filtrado y selección
decir que queremos sacar los nombres completos de los repos de Swoop como un array JSON. “Propia” significa en este caso no bifurcada.
swoop_repos | JQ ' [[] | Select(.Fork == false) | .full_name]'
vamos a analizar este una pieza a la vez:
- la envoltura
[...]
funde cualquier salida en una matriz. - has visto
. []
ya. Rompe el único arreglo de discos entrada en muchas entradas separadas, una por cada repo. - select
- el filtro de .full_name
aquí es equivalente a usar guión bajo-cli y una expresión de json:select:
swoop_repos | resaltar seleccione ' objeto: has(.fork:expr(x=false)) > .full_name '
en ambos casos no estamos ahorrando mucho código, pero no tener que crear archivos sólo mantiene las cosas más simples. Para la comparación, aquí está el código para generar los nombres de los repos de GitHub de Swoop en Ruby.
Comments
0 comments
Twitter
RSS