2012-09-28 23 views
6

Estoy tratando de obtener algunos valores de JSON anidado para millones de filas (tabla de 5 TB +). ¿Cuál es la forma más eficiente de hacer esto?Colmena: análisis JSON

Aquí se muestra un ejemplo:

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}} 

necesito estos valores fuera de la JSON anterior:

Country  Page  impressions_s  impressions_o 
---------  -----  -------------  -------------- 
US    2  10     10 

Ésta es la función json_tuple de la colmena, no estoy seguro si esto es la mejor función. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-getjsonobject

Respuesta

3

Puede utilizar get_json_object :

select get_json_object(fieldname, '$.country'), 
     get_json_object(fieldname, '$.data.ad.s') from ... 

Obtendrá un mejor rendimiento con json_tuple, pero encontré un "cómo hacerlo" para obtener los valores en json dentro de json; Para formatear su mesa se puede usar algo como esto:

from table t lateral view explode(split(regexp_replace(get_json_object(ln, ''$.data.ad.s'), '\\[|\\]', ''), ',')) tb1 as s este código anterior se transformará "matriz" en una columna.

forma más: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF

Espero que esta ayuda ...

6

Esto es lo que puede probar de forma rápida, sugeriría utilizar Json-Ser-De.

/tmp/hive-parsing-json.json nano

{"country":"US","page":227,"data":{"ad":{"impressions":{"s":10,"o":10}}}} 

Crear una tabla de base:

hive > CREATE TABLE hive_parsing_json_table (json string); 

archivo JSON carga a la Tabla:

hive > LOAD DATA LOCAL INPATH '/tmp/hive-parsing-json.json' INTO TABLE hive_parsing_json_table; 

consulta la tabla:

hive > select v1.Country, v1.Page, v4.impressions_s, v4.impressions_o 
from hive_parsing_json_table hpjp 
    LATERAL VIEW json_tuple(hpjp.json, 'country', 'page', 'data') v1 
    as Country, Page, data 
    LATERAL VIEW json_tuple(v1.data, 'ad') v2 
    as Ad 
    LATERAL VIEW json_tuple(v2.Ad, 'impressions') v3 
    as Impressions 
    LATERAL VIEW json_tuple(v3.Impressions, 's' , 'o') v4 
    as impressions_s,impressions_o; 

Salida:

v1.country v1.page  v4.impressions_s v4.impressions_o 
US  227  10   10 
0

Usando colmena nativa json-serde('org.apache.hive.hcatalog.data.JsonSerDe') usted puede hacer esto .. Estos son los pasos

Agregar archivo JAR/ruta/a/colmena hcatalog núcleos.tarro;

create a table as below 
CREATE TABLE json_serde_nestedjson (
    country string, 
    page int, 
    data struct < ad: struct < impressions: struct < s:int, o:int > > > 
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'; 

continuación, cargar los datos (almacenados en el archivo)

LOAD DATA LOCAL INPATH '/tmp/nested.json' INTO TABLE json_serde_nestedjson; 

los datos requeridos a continuación, obtener utilizando

SELECT country, page, data.ad.impressions.s, data.ad.impressions.o 
FROM json_serde_nestedjson;