2017-09-08 1 views
0

Ich habe Daten in einer Spalte, die unten wie folgt aussehen:Extrahieren von Text vor einem bestimmten Wort mit hive

  • Avenue 1 HE1 345 HOUSE 123
  • FLAT 202 HRE2 D34 HOUSE 345.

  • DOOR 324 HA1 345 HOUSE 67

5.

Ich muss die Postleitzahl, die immer vor dem Haus kommt, in allen Fällen zwischen 6-7 Zeichen extrahieren. Es gibt immer einen Leerraum vor HAUS und zwischen der Postleitzahl und einer vor der Postleitzahl.

gewünschte Ausgabe:

  • HE1 345
  • HRE2 D34
  • HA1 345

Ich habe versucht, SUBSTRING_INDEX zweimal mit nur diesen Bienenstock zu wissen, nicht die Funktion unterstützen . Ich bin ziemlich neu in Hive. Hilfe und jede Bezugnahme auf Material wird auch eine große Geste sein.

Vielen Dank im Voraus.

+0

"Ich habe versucht, SUBSTRING_INDEX zweimal mit nur diesem Bienenstock zu wissen, nicht die Funktion unterstützen" https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions –

Antwort

1

Sie können dieses Regex-Muster ' {1}(\\w+ {1}\\w+) {1}HOUSE' verwenden. Das bedeutet ein Leerzeichen, ein oder mehrere Wortzeichen, ein Leerzeichen, ein oder mehrere Zeichen, ein Leerzeichen, HOUSE. In den Klammern ist eine Gruppe zu extrahieren. Gruppenindex ist 1.

Demo:

select regexp_extract(s,' {1}(\\w+ {1}\\w+) {1}HOUSE',1) 
from 
(select 'Avenue 1 HE1 345 HOUSE 123.' s union all 
select 'FLAT 202 HRE2 D34 HOUSE 345.' s union all 
select 'DOOR 324 HA1 345 HOUSE 67' s) s; 
OK 
HE1 345 
HRE2 D34 
HA1 345 
Time taken: 26.472 seconds, Fetched: 3 row(s) 

Für Groß- und Kleinschreibung Verwendung (?i) Modifikator:

hive> 
    > 
    > select regexp_extract(s,' (\\w+ \\w+) (?i)HOUSE',1) 
    > from 
    > (select 'Avenue 1 HE1 345 HOUSe 123.' s union all 
    > select 'FLAT 202 HRE2 D34 HOUsE 345.' s union all 
    > select 'DOOR 324 HA1 345 HOuSE 67' s) s; 
OK 
HE1 345 
HRE2 D34 
HA1 345 

Siehe regex docs hier: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

über Groß- und Kleinschreibung:

+0

'{1}'?! ......... –

+0

@ DuduMarkovitz Sicher, '{1}' Quantifizierer kann weggelassen werden. 'Wählen Sie regexp_extract (s, '(\\ w + \\ w +) HOUSE', 1)' – leftjoin

+0

@leftjoin Vielen Dank! Nur um hinzuzufügen, wenn Haus nicht Groß-und Kleinschreibung ist. Wie Haus oder Haus oder Haus oder Haus! –

-4

Sie können diese Datei als CSV-Datei speichern (Kopieren Sie den Inhalt in Notepad und speichern Sie das mit .csv-Erweiterung).

Jetzt können Sie Tabelle in Hive erstellen und Daten aus der CSV-Datei in der Tabelle laden.

Hive> create table text (Spalte1 Zeichenfolge, Spalte2 Zeichenfolge, Spalte3 Zeichenfolge, Spalte4 Zeichenfolge, Spalte5 Zeichenfolge, Spalte6 Zeichenfolge) Zeilenformat abgegrenzte Felder mit ''; OK Zeit genommen: 0,137 Sekunden

zum Laden von Daten in der Tabelle: Verwendung hive> Lastdaten LOCAL INPATH ‚Ort den Sie Datei‘ in Tabelle Text überschreibt;

Bienenstock> Daten laden LOCAL inpath '/ home/cloudera/FinalProjects/text.csv 'überschreibt den Tabellentext; Laden von Daten zu Tisch default.text Tabelle default.text Statistik: [NumFiles = 1, numRows = 0, Totalsize = 84, rawDataSize = 0] OK Zeit genommen: 0,59 Sekunden

hive> select column3, Spalte4 aus dem Text; OK HE1 345 HRE2 D34 HA1 345 Zeit genommen: 0,145 Sekunden, Fetched: 3 Zeile (n)

Verwandte Themen