17

Próbuję użyć EMR/Hive do importowania danych z S3 do DynamoDB. Mój plik CSV zawiera pola, które są ujęte w cudzysłowy i oddzielone przecinkiem. Podczas tworzenia zewnętrznej tabeli w ulu, jestem w stanie określić separator jako przecinek, ale jak mogę określić, że pola są ujęte w cudzysłowy?Jak obsługiwać pola zawarte w cudzysłowie (CSV) w importowaniu danych z S3 do DynamoDB przy użyciu EMR/Hive

Jeśli nie zaznaczę, widzę, że wartości w DynamoDB są wypełnione dwoma podwójnymi cudzysłowami "" wartością "", co wydaje się błędne.

Używam następującego polecenia do utworzenia zewnętrznej tabeli. Czy istnieje sposób na określenie, że pola są ujęte w podwójne cudzysłowy?

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '","' LOCATION 's3://emrTest/folder'; 

Wszelkie sugestie będą mile widziane. Dzięki Jitendra

Odpowiedz

3

Jeśli utkniesz w formacie CSV, będziesz musiał użyć niestandardowego SerDe; a oto trochę work based on the opencsv libarary.

Ale jeśli można zmodyfikować pliki źródłowe, można wybrać nowy separator, aby cytowane pola nie były konieczne (powodzenia) lub przepisać ponownie, aby uciec od wszelkich przecinków z pojedynczym znakiem escape, np. „\”, Które mogą być określone w FORMAT rzędzie z uciekł:

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' LOCATION 's3://emrTest/folder'; 
2

Hive nie obsługuje cytowanych ciągów od razu po wyjęciu z pudełka. Istnieją dwa podejścia do rozwiązania tego problemu:

  1. Użyj innego separatora pól (np. Rury).
  2. Napisz niestandardową formułę InputFormat opartą na OpenCSV.

Szybsze (i prawdopodobnie bardziej rozsądne) podejście polega na zmodyfikowaniu początkowego procesu eksportu, aby użyć innego separatora, aby uniknąć cytowanych ciągów. W ten sposób można powiedzieć gałąź użycie tabeli zewnętrznej karcie lub rury z separatora:

CREATE TABLE foo (
    col1 INT, 
    col2 STRING 
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'; 
20

ja również zatrzymany z tego samego problemu jak moi pola są dołączone cudzysłowach i oddzielone średnikiem (;). Moja nazwa tabeli to employee1.

Więc szukałem z linkami i znalazłem idealne rozwiązanie do tego.

Musimy użyć Serde do tego. Proszę pobrać serde słoik za pomocą tego linku: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar

następnie wykonaj poniższe czynności wykorzystujących ula monit:

add jar path/to/csv-serde.jar; 

create table employee1(id string, name string, addr string) 
row format serde 'com.bizo.hive.serde.csv.CSVSerde' 
with serdeproperties(
"separatorChar" = "\;", 
"quoteChar" = "\"") 
stored as textfile 
; 

a następnie załadować dane z danej ścieżki za pomocą poniższego zapytania:

load data local inpath 'path/xyz.csv' into table employee1; 

a następnie uruchom :

select * from employee1; 

Teraz zobaczysz magię. Dzięki.

+0

myślę, że to powinno być 'poprawny' odpowiedź. Ktoś? Po prostu zmień "\" "na" \ ", jeśli Twój kod nie działa. – kennyut

+0

Na wypadek, gdyby ktoś ponownie się z tym spotkał. Hive obejmuje teraz 'org.apache.hadoop.hive.serde2.OpenCSVserde'. Zobacz moją odpowiedź poniżej. –

1

użyć pliku w zapytaniu ula csv-serde-0.9.1.jar patrz http://illyayalovyy.github.io/csv-serde/

add jar /path/to/jar_file 

Create external table emrS3_import_1(col1 string, col2 string, col3 string, col4 string) row format serde 'com.bizo.hive.serde.csv.CSVSerde' 
with serdeproperties 
(
    "separatorChar" = "\;", 
    "quoteChar" = "\" 
) stored as textfile 
tblproperties("skip.header.line.count"="1") ---to skip if have any header file 
LOCATION 's3://emrTest/folder'; 
3

Ula zawiera teraz OpenCSVSerde, która prawidłowo analizuje te cytowane pola bez dodawania dodatkowych słoików lub niestabilnego i wolnego od błędów wyrażeń regularnych.

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

10

następujący kod rozwiązać sam rodzaj problemu

CREATE TABLE TableRowCSV2( 
    CODE STRING,   
    PRODUCTCODE STRING, 
    PRICE STRING  
) 
    COMMENT 'row data csv'  
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 

WITH SERDEPROPERTIES (
    "separatorChar" = "\,", 
    "quoteChar"  = "\"" 
) 
STORED AS TEXTFILE 
tblproperties("skip.header.line.count"="1"); 
Powiązane problemy