2012-04-03 11 views
16

¿Hay alguna forma de convertir el resultado de la consulta Hive en formato JSON?Formato de salida JSON para resultados de Hive Query

+1

http://code.google.com/p/hive-json-serde/ –

+1

Parece que no soy el único que busca esta solución. Gracias por compartir el proyecto. Veremos cómo puede ser útil. – divinedragon

+0

@Steve Revisé el hive-json-serde. Parece que es para leer y procesar los datos JSON. Estaba buscando algo en que mis datos estén delimitados por tabuladores, pero cuando los consulto desde la sección, el resultado de la consulta está en el formato json. – divinedragon

Respuesta

5

Esto parece surgir con bastante frecuencia. Use las "UDFs to_json" de Brickhouse (http://github.com/klout/brickhouse). Si convierte sus resultados a named_struct, lo interpretará como un mapa JSON y lo publicará en consecuencia.

SELECT to_json(named_struct("field1", field1 , 
      "field2", field2, 
      "field3", field3)) 
    FROM mytable; 

El to_json también interpretará matrices y mapas en consecuencia.

0

Mi experiencia será con la biblioteca de jackson (http://jackson.codehaus.org/), usted crea un POJO para mapear el formato json. Entonces, una vez que obtiene el ResultSet de su consulta de colmenas, itera a través de él y crea objetos del POJO usando Jackson.

/**--JACKSON Class--**/ 
public class Item { 
    @JsonProperty 
    private String att1; 
    @JsonProperty 
    private String att2; 
    public Item(String att1, String att2){ 
     this.att1 = att1; 
     this.att2 = att2; 
    } 

} 

/**--the class where u run your query--**/ 
List<Item> list = new ArrayList<Item>(); 
ResultSet rs = executeQuery(queryStr); // do your hive query here 
while(rs.next){ 
    String att1 = rs.get("att1"); 
    String att2 = rs.get("att2"); 
    Item item = new Item(att1, att2); 
    list.add(item); 
} 

luego puede devolver una Lista de elementos como resultado, Jackson le permite escribirlo en formato json muy fácilmente.

  1. crear un ObjectMapper ObjectMapper mapper = new ObjectMapper(); El mapeador le ofrece muchas opciones para escribir el objeto en formato json en un objetivo diferente. p.ej. outputstream, bytebuffer, etc.

  2. iterar a través de la lista.

  3. use mapper para escribir el valor en formato json, ej. mapper.writeValue (out, Item). En este ejemplo, out es OutputStream.

+0

Gracias. Estaba planeando escribir un UDF de Hive para esto. Trataremos de incorporar esto. – divinedragon

+0

¿Tienes esto ordenado? – Shengjie

+0

Estoy trabajando en el UDF. Se publicará cuando haya terminado. – divinedragon

0

La manera más fácil sería primero almacenar como tsv y luego utilizar bibliotecas como spray para convertir a JSON.

La colmena funciona bien siempre y cuando no intente personalizar demasiado. Si tiene acceso a Spark en su clúster, use SparkSQL en lugar de Hive. Los resultados de su consulta se almacenarán en un SchemaRDD y desde allí se puede asignar fácilmente a un JSon haciendo .map (_. ToJson), suponiendo que haya importado spray en su alcance.

1

Estaba usando una herramienta llamada Apache Nifi. Tiene procesador AvrotoJSON. La salida de colmena que está en formato Avro se puede convertir fácilmente a JSON. El siguiente enlace será útil: https://nifi.apache.org/