Apache PIG:将一个数据集附加到另一个数据集

Posted

技术标签:

【中文标题】Apache PIG:将一个数据集附加到另一个数据集【英文标题】:Apache PIG: append one dataset to another one 【发布时间】:2013-11-26 19:08:05 【问题描述】:

我正在尝试将一个数据集附加到 Apache Pig 中的另一个数据集。有几个例子,但我认为这与我的问题不同。

这是我的猪脚本:

line1 = 使用 Table() 加载“line1/points”;

line20 = 使用 Table() 加载“line20/points”;

描述第 1 行;

转储第 1 行;

描述第 20 行;

转储第 20 行;

X = UNION line1, line20;

描述 X;

转储 X;

我明白了:

line1: key: bytearray,y: (name: chararray,value: long),x: (name: chararray,value: long),columns: (name: chararray,value: bytearray)

(ab48a8567d58cfea52905db0e94d88d3,(y,3),(x,3))

(ab48a8567d58cfea52905db0e94d88d3,(y,1),(x,1))

(ab48a8567d58cfea52905db0e94d88d3,(y,2),(x,2))

line20: key: bytearray,y: (name: chararray,value: long),x: (name: chararray,value: long),columns: (name: chararray,value: bytearray)

(203146881b7ef0d26902ea440e734b79,(y,20),(x,20))

(203146881b7ef0d26902ea440e734b79,(y,21),(x,21))

(203146881b7ef0d26902ea440e734b79,(y,22),(x,22))

X: key: bytearray,y: (name: chararray,value: long),x: (name: chararray,value: long),columns: (name: chararray,value: bytearray)

(203146881b7ef0d26902ea440e734b79,(y,21),(x,21))

(203146881b7ef0d26902ea440e734b79,(y,22),(x,22))

(203146881b7ef0d26902ea440e734b79,(y,20),(x,20))

(203146881b7ef0d26902ea440e734b79,(y,20),(x,20))

(203146881b7ef0d26902ea440e734b79,(y,21),(x,21))

(203146881b7ef0d26902ea440e734b79,(y,22),(x,22))

结果只是“line20”数据集的双重副本。为什么?

我想从“line1”获取值,然后从“line20”获取值。

顺便说一句:...使用 Table(); - 这只是我对 CassandraStorage 的实现,我在其中自动为列提供类型。

感谢您的帮助!

解决方案

Configuration 已共享。我忘记了,我为两个 Table() 实例使用相同的 ID 来初始化它们。

【问题讨论】:

如果您可以将示例数据减少到几行/几列 - 这会有所帮助。 完成。我希望它有所帮助。 谢谢。这看起来真的很奇怪。我会尝试将文本文件作为输入做同样的事情,用普通的 PigStorage 加载它们。只是为了进行健全性检查。如果这有帮助,那么我会得出结论,问题出在 Table() 中。您确定这两个调用不会相互重叠吗? 是的,UNION 在两个加载有... PigStorage(','); 的文件上工作正常。我刚刚检查过了。不,这两个Table() 调用不会相互重叠。但是,我将在我的Table() 课程中搜索问题。谢谢。 我错了。对不起。两个Table() 实例确实重叠。 @Pradeep Gollakota 指出配置对象是共享的。那是我的错误。感谢您的帮助。 【参考方案1】:

我在使用 Apache Accumulo 时遇到了类似的问题。 Pig 试图在两个 Accumulo 表上进行 Map 侧连接。但是,由于重用配置对象,API 不支持同时读取多个表,因此无法做到这一点。 HBase 没有这个问题,因为即使 Configuration 对象是共享的,但多个表配置存储在不同的 key 下。我没有与 Cassandra 合作过,所以我不能完全确定。但我猜这是 Table() LoadFunc 的问题。检查 LoadFunc 是否没有通过多次调用 LoadFunc 来破坏配置。

测试它的一种快速方法是切换联合中的关系顺序。我敢打赌,如果你写了UNION line20, line1;,你会看到两份line1

【讨论】:

是的,UNION line20, line1 给了我两份line1 这是关键:配置对象是共享的 谢谢你的帮助。现在可以使用了。

以上是关于Apache PIG:将一个数据集附加到另一个数据集的主要内容,如果未能解决你的问题,请参考以下文章

使用 Apache Hadoop Pig 内连接两个数据集

Apache Pig - 在脚本中多次调用 Java UDF ToJSON

当键分为列时,如何在 Apache Pig 中加入两个商店?

Apache Pig - 如何提取记录集

Apache Pig 学生成绩平均计算

MAX(Count) 函数 apache pig latin