Загрузить данные в массив улья - PullRequest
0 голосов
/ 01 марта 2019

У меня есть данные в CSV, которые выглядят как

David,"""SMARTPHONE,6""|""COMPUTER,3""|""LAPTOP,1"""

Я пытаюсь загрузить их в свою таблицу улья

create table user_device(name string, devices array<struct<devicename: string, number : int>>) 
FIELDS TERMINATED BY ','
collection items terminated by '|'
STORED AS TEXTFILE
LOCATION 'maprfs:///user/david/';

Я ожидал увидеть

[{"devicename":"SMARTPHONE","number":6},{"devicename":"COMPUTER","number":3},{"devicename":"LAPTOP","number":1}]

Но когда я пытаюсь выполнить запрос к таблице, я вижу, что массив struct

[{"devicename":"\"\"\"SMARTPHONE","number":null}]

Остальная часть массива и структура пропали.

Кто-нибудь знает, как мне этого добиться?

Спасибо, Дэвид

1 Ответ

0 голосов
/ 13 марта 2019

Он код, который я использовал.В подходе я использовал python для очистки перед переходом к HQL-запросам.Таким образом, после выполнения некоторых шагов спора, у меня есть файл, подобный этому ниже (сохраненный без indices и headers) в моей локальной файловой системе, так как это небольшой файл:

import pandas as pd
import numpy as np 

    Name  devicename number
0  David  SMARTPHONE      6
1           COMPUTER      3
2             LAPTOP      1

Затем временная таблица tempt создается и заполняется данными из LFS или HDFS:

create table tempt
(
name       string,
devicename string,
number     int
)
row format delimited 
FIELDS TERMINATED BY ',';
load data local inpath '/path_to_file' overwrite into table tempt;

select * from tempt;
+--------------------+--------------------------+----------------------+--+
| tempt.name         | tempt.devicename         | tempt.number         |
+--------------------+--------------------------+----------------------+--+
| David              | SMARTPHONE               | 6                    |
|                    | COMPUTER                 | 3                    |
|                    | LAPTOP                   | 1                    |
+--------------------+--------------------------+----------------------+--+

А теперь

Insert overwrite table user_device
select name,
array(named_struct("devicename",devicename,"number",number)) from tempt;

select * from user_device;

, и результат теперь соответствует ожидаемому.

+-----------------+-------------------------------------------+--+
|user_device.name |            user_device.devices            |
+-----------------+-------------------------------------------+--+
| David           | [{"devicename":"SMARTPHONE","number":6}]  |
|                 | [{"devicename":"COMPUTER","number":3}]    |
|                 | [{"devicename":"LAPTOP","number":1}]      |
+-----------------+-------------------------------------------+--+

Ура!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...