amazon-web-services - not - tablas temporales en hive
Cómo manejar los campos encerrados entre comillas(CSV) al importar datos desde S3 a DynamoDB usando EMR/Hive (7)
Hive ahora incluye un OpenCSVSerde
que analizará correctamente los campos citados sin agregar OpenCSVSerde
adicionales o propensos a errores y regex lenta.
ROW FORMAT SERDE ''org.apache.hadoop.hive.serde2.OpenCSVSerde''
Estoy tratando de usar EMR / Hive para importar datos de S3 a DynamoDB. Mi archivo CSV tiene campos que están entre comillas dobles y separados por comas. Al crear una tabla externa en Hive, puedo especificar el delimitador como una coma, pero ¿cómo puedo especificar que los campos estén encerrados entre comillas?
Si no especifico, veo que los valores en DynamoDB se completan con dos comillas dobles "" valor "" que parece estar equivocado.
Estoy usando el siguiente comando para crear una tabla externa. ¿Hay una manera de especificar que los campos están encerrados entre comillas dobles?
CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ''","'' LOCATION ''s3://emrTest/folder'';
Cualquier sugerencia sera apreciada. Gracias jitendra
Hive no admite cadenas citadas desde el primer momento. Hay dos enfoques para resolver esto:
- Utilice un separador de campo diferente (por ejemplo, una tubería).
- Escribe un InputFormat personalizado basado en OpenCSV.
El enfoque más rápido (y posiblemente más sensato) es modificar su proceso inicial de exportación para usar un delimitador diferente, de modo que pueda evitar las cadenas entre comillas. De esta manera puede decirle a Hive que use una tabla externa con una pestaña o delimitador de tuberías:
CREATE TABLE foo (
col1 INT,
col2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ''|'';
Puede haber múltiples soluciones a este problema.
- Escribe clase personalizada SerDe
- Utilice RegexSerde
- Eliminar los caracteres delimitadores escapados de los datos
Lea más en http://grokbase.com/t/hive/user/117t2c6zhe/urgent-hive-not-respecting-escaped-delimiter-characters
Si estás atascado con el formato de archivo CSV, tendrás que usar un SerDe personalizado; y aquí hay un trabajo basado en el libarary opencsv .
Pero, si puede modificar los archivos de origen, puede seleccionar un nuevo delimitador para que los campos citados no sean necesarios (buena suerte), o reescribir para escapar de las comas incrustadas con un solo carácter de escape, por ejemplo, ''/', que se puede especificar dentro del FORMATO DE FILA con ESCAPED BY :
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'';
Siguiente código resuelto mismo tipo de problema
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");
También me quedé atascado con el mismo problema ya que mis campos están entre comillas dobles y separados por punto y coma (;). Mi nombre de tabla es employee1.
Así que he buscado con enlaces y he encontrado la solución perfecta para esto.
Tenemos que usar serde para esto. Por favor descargue serde jar usando este enlace: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar
luego siga los pasos a continuación usando el indicador de Hive:
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
;
y luego cargue los datos de su ruta dada usando la siguiente consulta:
load data local inpath ''path/xyz.csv'' into table employee1;
y luego ejecute:
select * from employee1;
Ahora verás la magia. Gracias.
Use el archivo csv-serde-0.9.1.jar
en su consulta de csv-serde-0.9.1.jar
, vea 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'';