2017-11-08 3 views
0

Wie kann ich Tabelle in Hive mit rohen JSON-Feld (keine Analyse, als Klartext) definieren?Raw Json Feldtyp in Bienenstock

Für die folgende s3-Datei:

{"first_field":1, "json_field": {"a":{"b":"c"}, "d":"e"}, "sec_field":4} 
{"first_field":2, "json_field": {"m":"cv", "d":"e"}, "sec_field":5} 
{"first_field":3, "json_field": {"k":1, "d":"e"}, "sec_field":6} 

Ich wünsche, dass die folgende Abfrage:

select first_field, json_field, sec_field from web.json_table; 

zurück um:

1 {"a":{"b":"c"}, "d":"e"} 4 
2 {"m":"cv", "d":"e"}   5 
3 {"k":1, "d":"e"}   6 

Ich habe versucht, die Tabellen wie folgt zu definieren:

CREATE EXTERNAL TABLE web.json_table(
first_field integer, 
json_field string, 
sec_field integer 
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
location 's3n://my-bucket'; 

aber die Abfrage Rückkehr:

hive> select first_field, json_field, sec_field from web.json_table; 
OK 
1 { NULL 
2 { NULL 
3 { NULL 

Antwort

0

Ich denke, Sie nicht eine generische Art und Weise jede JSON in einer Zeichenfolge zur Karte haben können.

Sie müssen definiert Ihre json_field als Fest Struct:

{"a":{"b":"c"}, "d":"e"} ==> STRUCT<a:STRUCT<b:STRING>,d:STRING> 

{"m":"cv", "d":"e"} ==> STRUCT<m:STRING,d:STRING> 

{"k":1, "d":"e"} ==> STRUCT<k:STRING,d:STRING> 

für Ihre tatsächliche JSON:

CREATE EXTERNAL TABLE web.json_table (
    first_field integer, 
    json_field STRUCT<a:STRUCT<b:STRING>,d:STRING,m:STRING,k:STRING>, 
    sec_field integer 
) 
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' 
location 's3n://my-bucket'; 

Warnung: alte Hive-Version nicht Großbuchstaben in JSON Key nicht unterstützt.

EDIT:

  1. Eine externe CSV Tabelle ext_table mit einer einzigen json_data Spalten als Zeichenkette (einen speziellen Abscheider benutzen, die doesn'nt apppear, ex 0x00 oder 0x01)
  2. Erstellen Ansicht get_json_object Verwendung basierte eine vorherige Tabelle ext_table, um alle Ihre festen und dynamischen Felder
+0

zu extrahieren Ja, ich bin mir bewusst, dass t Option, aber es ist nicht das, was ich mir wünsche. Da mein verschachtelter JSON nicht vorhersehbar ist. Ich möchte eine solche Abfrage mit Presto haben: wählen Sie get_json_object (json_field, "$ .a") von web.json_table; – Ran