Apache Свинья загружает только первый вложенный кортеж - PullRequest
0 голосов
/ 06 февраля 2020

Я использую точный образец из официального документа :

У меня есть data.txt:

(3,8,9) (mary,19)
(1,4,7) (john,18)
(2,5,8) (joe,18)

Я запускаю:

A = LOAD 'data.txt' AS (F:tuple(f1:int,f2:int,f3:int),T:tuple(t1:chararray,t2:int));
dump A

Я всегда получаю:

((3,8,9),)
((1,4,7),)
((2,5,8),)

Второй вложенный кортеж никогда не загружается. Я пробовал в обеих версиях 0.16.0 и 0.17.0.

1 Ответ

1 голос
/ 07 февраля 2020

Проблема должна быть в созданном вами файле данных. Во время создания обоих кортежей в качестве разделителя в файле данных должна быть вкладка . Если было пробел , то нам нужно соответствующим образом изменить запрос загрузки.

a) С табуляцией (\ t) в качестве разделителя или разделителя.

grunt> A = LOAD '/home/ec2-user/data' AS (F:tuple(f1:int,f2:int,f3:int),T:tuple(t1:chararray,t2:int));
grunt> DESCRIBE A;
A: {F: (f1: int,f2: int,f3: int),T: (t1: chararray,t2: int)}
grunt> dump A;
((3,8,9),(mary,19))
((1,4,7),(john,18))
((2,5,8),(joe,18))

b) С одним пробелом () в качестве разделителя или разделителя.

grunt> A = LOAD '/home/ec2-user/data' AS (F:tuple(f1:int,f2:int,f3:int),T:tuple(t1:chararray,t2:int));
grunt> DESCRIBE A;
A: {F: (f1: int,f2: int,f3: int),T: (t1: chararray,t2: int)}
grunt> dump A;
((3,8,9),)
((1,4,7),)
((2,5,8),)

# Используйте PigStorage ('') в случае если вы все еще хотите использовать пробел в качестве разделителя для файла.

grunt> A = LOAD '/home/ec2-user/data' USING PigStorage(' ') AS (F:tuple(f1:int,f2:int,f3:int),T:tuple(t1:chararray,t2:int));
grunt> DESCRIBE A;
A: {F: (f1: int,f2: int,f3: int),T: (t1: chararray,t2: int)}
grunt> dump A;
((3,8,9),(mary,19))
((1,4,7),(john,18))
((2,5,8),(joe,18))
...