2016-06-07 9 views
4

Я пытаюсь создать таблицу в Impala из CSV, которую я загрузил в каталог HDFS. CSV содержит значения с запятыми, заключенными внутри кавычек.Создать таблицу из CSV со значениями, содержащими запятые, заключенные в кавычки

Пример:

1.66.96.0/19,"NTT Docomo,INC.","Ntt Docomo",9605,"NTT DOCOMO, INC." 
1.66.128.0/17,"NTT Docomo,INC.","Ntt Docomo",9605,"NTT DOCOMO, INC." 
1.67.0.0/17,"NTT Docomo,INC.","Ntt Docomo",9605,"NTT DOCOMO, INC." 
1.67.128.0/18,"NTT Docomo,INC.","Ntt Docomo",9605,"NTT DOCOMO, INC." 
1.67.192.0/19,"NTT Docomo,INC.","Ntt Docomo",9605,"NTT DOCOMO, INC." 

Impala documentation говорит, что это может быть решена с помощью ESCAPED BY пункта. Вот мой текущий код:

DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4 (
    network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' 

LOCATION 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/'; 

INVALIDATE METADATA GeoIP2_ISP_Blocks_IPv4; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Я также попытался с помощью предложения ESCAPED BY '"'. В обоих случаях Impala принимает запятую внутри кавычек и использует ее как разделитель, разделяя значение на две колонки.

Любые идеи о том, как исправить код, чтобы этого не произошло?

EDIT (6/9/2015)

Итак, я прошел через следующие вариации, на основе предложений @k S Nidhin и @JTUP. Тем не менее, каждое изменение возвращается тот же результат, как запросы написаны без оператора SERDEPROPERTIES, с запятые до сих пор вызывает значения появляются в неправильных столбцах:

Вариант 1

DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4 (
    network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
WITH SERDEPROPERTIES ("quoteChar" = "'", "escapeChar" = "\\") 

LOCATION 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/'; 

INVALIDATE METADATA GeoIP2_ISP_Blocks_IPv4; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Вариант 2

DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4 (
    network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' 
WITH SERDEPROPERTIES ('quoteChar' = '"', 'escapeChar' = '\\') 

LOCATION 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/'; 

INVALIDATE METADATA GeoIP2_ISP_Blocks_IPv4; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Вариант 3

DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4 (
    network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' 
WITH SERDEPROPERTIES (
    "separatorChar" = "\,", 
    "quoteChar"  = "\"" 
) 

LOCATION 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/'; 

INVALIDATE METADATA GeoIP2_ISP_Blocks_IPv4; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Любые другие идеи или дальнейшие изменения оператора SERDEPROPERTIES?

EDIT (6/10/2016)

Я был в состоянии получить другой вариант запроса с использованием SERDE и SERDEPROPERTIES операторов работать в улей (на основе кода, представленной в Hive Documentation), с собственно таблица создается:

DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4(network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING) 

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

WITH SERDEPROPERTIES (
    'separatorChar' = ',', 
    'quoteChar'  = '"', 
    'escapeChar' = '\\' 
) 
STORED AS TEXTFILE; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Поскольку оператор SERDE не доступен в Импале, это решение не будет работать там. Я прекрасно создаю таблицы в Hive, но все равно неудобно, что я не могу найти жизнеспособное решение в Impala.

+0

Попробуйте добавить свойства serde С SERDEPROPERTIES ( "QuoteChar" = "'", "escapeChar" = "\\" ) –

ответ

0
DROP TABLE IF EXISTS GeoIP2_ISP_Blocks_IPv4; 

CREATE TABLE GeoIP2_ISP_Blocks_IPv4 (
    network STRING 
,isp STRING 
,organization STRING 
,autonomous_system_number STRING 
,autonomous_system_organization STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' 

WITH SERDEPROPERTIES (
    "separatorChar" = "\,", 
    "quoteChar"  = "\"" 
) 

LOCATION 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/'; 

INVALIDATE METADATA GeoIP2_ISP_Blocks_IPv4; 

LOAD DATA INPATH 'hdfs://.../GeoIP2_ISP_Blocks_IPv4/' 
INTO TABLE GeoIP2_ISP_Blocks_IPv4; 

Сложение с SERDEPROPERTIES, который, мы надеемся, должны сделать трюк

+0

Просто попробовал , К сожалению, он выглядит так: 'OPTIONALLY ENCLOSED BY' не поддерживается Impala. – nxl4

+0

сделал чек, чтобы проверить, работает ли он. Я не делал этого со своей последней работы. поэтому не уверен, если у меня это в нужном месте. но с serdeproperties должны помочь с запятыми. – JT4U

+0

см. Мое редактирование в OP выше. – nxl4

 Смежные вопросы

  • Нет связанных вопросов^_^