使用 Pig 加载默认转储文件

Posted

技术标签:

【中文标题】使用 Pig 加载默认转储文件【英文标题】:Load Default Dump file using Pig 【发布时间】:2014-11-05 09:19:52 【问题描述】:

这是 PigStorage() 需要用来获取以下查询的加载文件

INSERT OVERWRITE DIRECTORY 'doop'
select a.* from cdr.cell_tower_info

上述查询的输出是这样的

Haryana Ambala 404 20 80 37591 76.76746 30.373488 404-20-80-37591 Haryana Ambala 404 20 80 30021 76.76746 30.373488 404-20-80-30021 Haryana Ambala 404 20 80 37591 76.76746 30.373488 404-20-80-37591

我正在使用 CDR 分析,首先我需要使用 select 从表中检索一些字段并将其保存到 HDFS 文件夹中,此结果再次需要使用 pig 加载以进行进一步分析

【问题讨论】:

最初表 (cdr.cell_tower_info) 在 hive 中??? @KishoreKumarSuthar 是的,桌子在 Hcatlog 你想在pig中加载以上数据并打印为每个字段吗? 我需要将上述结果加载到 Pig 中进行进一步分析 【参考方案1】:

试试这个

CREATE EXTERNAL TABLE cell_tower_info
   FIELDS TERMINATED BY ','
   LOCATION 'doop'
   AS
SELECT .* from cdr.cell_tower_info

【讨论】:

它显示错误,例如无法在某个位置创建外部表【参考方案2】:

Hive 默认分隔符是 ctrl-A (\001)。

我认为 PigStorage('\001') 应该可以使用 PIG 中的 Hive 输出数据。

Hive 表也可以定义为 以 '\t' 结尾的字段,这样结果就可以直接在 PIG 中使用。

【讨论】:

A = LOAD '/user/hue/doop' using PigStorage('\001'); B = foreach A 生成 $8 作为 cell_id;转储 B;上面的查询是我试过的,我得到了一个错误,比如 org.apache.pig.PigServer - 解析过程中的异常:解析过程中的错误。 意外字符 '0'【参考方案3】:

你能试试这个吗?input.txt

Haryana Ambala  404 20  80  37591   76.76746    30.373488   404-20-80-37591
Haryana Ambala  404 20  80  30021   76.76746    30.373488   404-20-80-30021
Haryana Ambala  404 20  80  37591   76.76746    30.373488   404-20-80-37591

PigScript:

A = LOAD 'input.txt' AS line;
B = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\\s+')) AS (f1:chararray,f2:chararray,f3:int,f4:int,f5:int,f6:int,f7:double,f8:double,f9:chararray);
C = FOREACH B GENERATE f1,f2,f8,f9;
DUMP C;

输出:

(Haryana,Ambala,30.373488,404-20-80-37591)
(Haryana,Ambala,30.373488,404-20-80-30021)
(Haryana,Ambala,30.373488,404-20-80-37591)

【讨论】:

(HaryanaAmbala40420803759176.7674630.373488404-20-80-37591 ,,,)(HaryanaAmbala40420803002176.7674630.373488404-20-80-30021 ,,,)(HaryanaAmbala40420803759176.7674630.373488404-20-80-37591 ,,,)是我在运行查询时得到的结果,它将整个列作为单个字符串 对我来说,它对于给定的输入工作正常,不确定为什么它不适合你。好的,你能检查你的输入文件,让我知道每个空格的分隔符是什么。如果您使用的是 Windows,请在 notepad++ 中打开您的输入文件并检查 notepad++->View->ShowSymbol 下的隐藏分隔符。如果您使用的是 MAC OS,您可以使用 sublimetext 或 Textmate 编辑器查看->显示不可见字符。这将帮助我们了解实际的分隔符。 在 unix 中,您可以在 vim 中使用 ":set list" 命令并检查空格字符。【参考方案4】:

如果您的数据存储在 hive 表中,那么,

X = LOAD 'hdfs://localhost:9000/user/hive/warehouse/input.txt' using PigStorage('\t')  AS line;
Y = FOREACH A GENERATE FLATTEN(STRSPLIT(line,'\\s+')) AS (A1:chararray,A2:chararray,A3:int,A4:int,A5:int,A6:int,A7:double,a8:double,A9:chararray);
Z = FOREACH B GENERATE A1,A2,A8,A9;
DUMP Z;

在我的情况下,端口是 9000。根据您的系统给出。

【讨论】:

以上是关于使用 Pig 加载默认转储文件的主要内容,如果未能解决你的问题,请参考以下文章

转储 Json 数据时出现 Apache Pig 错误

转储数据集时将数据从 Hive 加载到 Pig 错误

Pig 的“转储”在 AWS 上不起作用

使用 PIG 加载 Hive 表的问题

无法在 PIG 中转储关系

如何使用 apache pig 将标题行加入多个文件中的详细行