首页 > 解决方案 > Apache Pig 只加载第一个嵌套元组

问题描述

我使用官方文档中的确切示例:

我有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 的两个版本。

标签: apache-pig

解决方案


问题应该出在您创建的数据文件上。在创建数据文件时,两个元组之间应该有一个制表符作为数据文件中的分隔符。如果有空格,那么我们需要相应地更改负载查询。

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),)

#Use 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))

推荐阅读