hadoop - guardar - convertir excel a csv separado por punto y coma
Colmenar CSV de carga con comas en campos cotizados (5)
Estoy intentando cargar un archivo CSV en una tabla Hive así:
CREATE TABLE mytable
(
num1 INT,
text1 STRING,
num2 INT,
text2 STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";
LOAD DATA LOCAL INPATH ''/data.csv''
OVERWRITE INTO TABLE mytable;
El csv está delimitado por una coma (,) y se ve así:
1, "some text, with comma in it", 123, "more text"
Esto devolverá datos corruptos ya que hay un '','' en la primera cadena.
¿Hay alguna manera de establecer un delimitador de texto o hacer que Hive ignore el '','' en cadenas?
No puedo cambiar el delimitador de la csv ya que se extrae de una fuente externa.
A partir de Hive 0.14, el CSV SerDe es una parte estándar de la instalación de Hive
ROW FORMAT SERDE ''org.apache.hadoop.hive.serde2.OpenCSVSerde''
(Ver: https://cwiki.apache.org/confluence/display/Hive/CSV+Serde )
Agregue una barra invertida en FIELDS TERMINATED BY ''/;''
Por ejemplo:
CREATE TABLE demo_table_1_csv
COMMENT ''my_csv_table 1''
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ''/;''
LINES TERMINATED BY ''/n''
STORED AS TEXTFILE
LOCATION ''your_hdfs_path''
AS
select a.tran_uuid,a.cust_id,a.risk_flag,a.lookback_start_date,a.lookback_end_date,b.scn_name,b.alerted_risk_category,
CASE WHEN (b.activity_id is not null ) THEN 1 ELSE 0 END as Alert_Flag
FROM scn1_rcc1_agg as a LEFT OUTER JOIN scenario_activity_alert as b ON a.tran_uuid = b.activity_id;
Lo probé y funcionó.
El problema es que Hive
no maneja los textos citados. Necesita preprocesar los datos cambiando el delimitador entre los campos (p. Ej .: con un trabajo de Hadoop-streaming) o también puede intentar usar un SerDe de CSV personalizado que use OpenCSV para analizar los archivos.
Si puede volver a crear o analizar sus datos de entrada, puede especificar un carácter de escape para CREATE TABLE:
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY ''//';
Aceptará esta línea como 4 campos
1,some text/, with comma in it,123,more text
mantenga el delimitador entre comillas simples, funcionará.
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '',''
LINES TERMINATED BY ''/n'';
Esto funcionará