Загрузка данных CSV в таблицы Hive ORC - PullRequest
0 голосов
/ 11 июня 2019

У меня есть данные, как показано ниже:

id,name,description,category
1,sid,I am don,right?,production  

Я выполнил шаги, указанные в этой ссылке.Основная проблема заключается в том, что когда я вставляю данные во временную таблицу, данные в 3rd column разделяются и помещаются в 4-й столбец, т.е. когда он видит "," перед словом right, он разделяет данные и выталкивает их в следующуюколонка.Это потому, что я получаю данные в формате CSV и, следовательно, применяю разделитель как "," при создании временной таблицы.Итак, там беспорядок.Как я могу ее решить ??

После следующих шагов, предложенных xenodevil, я запустил запрос ниже, и у меня появляется ошибка:

insert into perTable select * from sampleTable; 

Где sampleTable - это временная таблица, а perTable - этотаблица ORC и данные sampleTable выглядят так:

+-----------------+-------------------+--------------------------+-----------------------+--+
| sampletable.id  | sampletable.name  | sampletable.description  | sampletable.category  |
+-----------------+-------------------+--------------------------+-----------------------+--+
| 1               | sid               | I am don,right?          | production            |
+-----------------+-------------------+--------------------------+-----------------------+--+

Но ошибка ниже:

ERROR : Status: Failed
ERROR : Vertex failed, vertexName=Map 1, vertexId=vertex_1560140822404_0022_1_00, diagnostics=[Task failed, taskId=task_1560140822404_0022_1_00_000000, diagnostics=[TaskAttempt 0 failed, info=[Error: Failure while running task:java.lang.RuntimeException: java.lang.RuntimeException: org.apache.hadoop.hive.ql.metadata.HiveException: Hive Runtime Error while processing row {"id":"1","name":"sid","description":"I am don,right?","category":"production"}
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.initializeAndRunProcessor(TezProcessor.java:173)
        at org.apache.hadoop.hive.ql.exec.tez.TezProcessor.run(TezProcessor.java:139) 

Так в чем здесь проблема ??

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Как вы собираетесь определить количество запятых в 3-м столбце? Если он может содержать любой текст, то он может содержать любое количество запятых. Это должно контролироваться на уровне генерации файла, т.е. когда ваши данные записываются, а не когда вы пытаетесь прочитать их позднее в формате CSV. При создании файла CVS вы можете

  • Перед каждой запятой ставится escape-символ, который является частью данных, а не разделителем запятых
  • Заключите текст каждого столбца в двойные кавычки
  • Заключайте только те столбцы, в которых символ разделения (запятая) присутствует в двойных кавычках

Это некоторые из распространенных практик, которые надежно решают такие проблемы.

Ненадежный способ, очень специфичный для представленных вами данных, который разрешает только лишние запятые в 3-м столбце, - это использовать следующий RegexSerDe для вашего ФОРМАТА ROW

([0-9]*),([a-zA-Z ]*),([A-Za-z ,?]*),([A-Za-z ,]*)

Чтобы установить это, вам нужно изменить DDL таблицы на что-то вроде:

CREATE TABLE `your_database_name.your_table_name`(
    `id` string,
    `name` string,
    `description` string,
    `category` string
)
COMMENT 'Your Comment'
ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='([0-9]*),([a-zA-Z ]*),([A-Za-z ,?]*),([A-Za-z ,]*)'
 )
STORED AS TEXT
;

Я проверил здесь Regex, но вам нужно будет настроить синтаксис DDL в соответствии с вашими потребностями.

0 голосов
/ 11 июня 2019

Вы можете использовать этот пример потока для загрузки данных в таблицу Hive.

1) Поскольку существует неопределенность, связанная с разделителем ,, обновите файл, чтобы иметь разделитель |, который идентифицирует фактические поля.Итак, файл выглядит так.Давайте назовем это data.csv.

1|sid|I am don,right?|production

2) Создайте таблицу в Hive, указав правильный разделитель столбцов.

hive> CREATE TABLE t1_tmp
(
    id string,
    name string,
    description string,
    category string
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
LINES TERMINATED BY '\n';

3) Загрузите данные из локального файла

hive> LOAD DATA LOCAL INPATH '/path/to/data.csv' INTO TABLE t1_tmp;

4) Просмотр данных

hive> select * from t1_tmp;
OK
t1_tmp.id   t1_tmp.name t1_tmp.description  t1_tmp.category
1           sid         I am don,right?     production
...