当前位置: 首页 > 知识库问答 >
问题:

使用pig,如何将混合格式行解析为元组和元组包?

慕高格
2023-03-14

我对pig是新手,在解析输入并将其转换成可以使用的格式时遇到了问题。输入文件包含同时具有固定字段和KV对的行,如下所示:

FF1FF2FF3FF4KVP1KVP2...KVPN

1|2|3|4|key1=value1|key2=value2
2|3|4|5|key1=value7|key2=value2|key3=value3

完成后,我希望能够生成以下结果(在这一点上,输出格式并不重要,我只是向您展示我希望的结果):

key1=value1 : 1
key1=value7 : 1
key2=value2 : 2
key3=value3 : 1

似乎我应该可以通过分组固定场并将一袋KV对拉平来生成交叉积来做到这一点

我试着用这样的东西读这篇文章:

data = load 'myfile' using PigStorage('|');
A = foreach data generate $0 as ff1:chararray, $1 as ff2:long, $2 as ff3:chararray, $3 as ff4:chararray, TOBAG($4..) as kvpairs:bag{kvpair:tuple()};
B = foreach A { sorted = order A by ff2; lim = limit sorted 1; generate group.ff1, group.ff4, flatten( lim.kvpairs ); };
C = filter B by ff3 matches 'somevalue';
D = foreach C generate ff1, ff4, flatten( kvpairs ) as kvpair;
E = group D by (ff1, ff4, kvpair);
F = foreach E generate group, COUNT(E);

虽然这让我得到了我想要的模式,但有几个问题我似乎无法解决:

  1. 通过使用TOBAG with..,没有模式可以应用于我的kvpairs,所以我无法对kvpair进行筛选,而且我似乎无法在任何时候强制转换它,所以这是一个全或无查询。
  2. 语句'C'中的筛选器似乎不返回任何数据,不管我使用什么值,即使我使用了类似'.*'或'.+'的内容。我不知道这是因为没有模式,还是这实际上是PIG中的一个bug。如果我从语句B中转储一些数据,我肯定会在那里看到与这些表达式匹配的数据。

因此,我尝试以不同的方式处理这个问题,通过使用以下代码加载数据:

data = load 'myfile' using PigStorage('\n') as (line:chararray);
init_parse = foreach data generate FLATTEN( STRSPLIT( line, '\\|', 4 ) ) as (ff1:chararray, ff2:chararray, ff3:chararray, ff4:chararray, kvpairsStr:chararray);
A = foreach mc_bk_data generate ff1, ff2, ff3, ff4, TOBAG( STRSPLIT( kvpairsStr, '\\|', 500 ) ) as kvpairs:bag{t:(kvpair:chararray)};

我也愿意采用其他方法来解决这个问题,但是我似乎可以找到很好的方法来将我的多个字段的元组转换成一个元组包,每个元组都有一个字段。

我使用的是Apache Pig版本0.11.1.1.3.0.0-107

提前谢了。

共有1个答案

严亮
2023-03-14

你的第二种方法是正确的。不幸的是,您需要一个UDF来将元组转换为包,而据我所知,没有构建器来实现这一点。然而,写一个很简单。

您不想在固定字段上分组,而是在键值对本身上分组。所以你只需要保留键值对的元组;您可以完全忽略固定字段。

UDF非常简单。在Java中,您可以在exec方法中执行以下操作:

DataBag b = new DefaultDataBag();
Tuple t = (Tuple) input.get(0);
for (int i = 0; i < t.size(); i++) {
    Object o = t.get(i);
    Tuple e = TupleFactory.getInstance().createTuple(o);
    b.add(e);
}

return b;

一旦有了它,将strsplit中的元组转换成一个包,将其扁平化,然后进行分组和计数。

 类似资料:
  • 下面我有以下数据。 所以,我不知道为什么UDF可以使用int而不能使用CharArray。此外,我觉得可能有一种方法可以做到这一点,而不使用UDF..但不确定从哪里开始。对这里可能发生的事情有什么建议吗?

  • 这是数据集。 我想把元组分成行。这是我的预期结果。 我用R搜索了元组格式,但找不到任何线索来得出结果。

  • 根据这一点,像XML这样的 但是,将Jackson XmlMapper(默认情况下)用于此类类: 给出一个错误: com.fasterxml.jackson.databind.exc.未识别属性异常:未识别字段""(类org.example.jackson.unwrap.TestIt1$根),未标记为可忽略(一个已知属性:"sub"])... 好的,我可以补充一下 除根文本“asdasda”外,我

  • 问题内容: 我有一个元组元组-例如: 我想按顺序将其转换为所有元素的平面一维列表: 我一直在尝试通过列表理解来实现。但我似乎无法弄清楚。我能够通过for-each循环来完成它: 但是我觉得必须有一种方法来理解列表。 一个简单的只是给您一个列表列表,而不是单个元素。我以为可以通过使用拆包运算符然后将列表拆包来建立此基础,如下所示: 要么 …但是那没用。有任何想法吗?还是我应该坚持下去? 问题答案:

  • 问题内容: 实现以下目标的Python方法是什么? 的每个成员都是一个元组,其第一个成员是,第二个成员是。 问题答案: 在Python 2中:

  • 我得到的错误是:无法将java.lang.String实例反序列化出START_OBJECT令牌 如何将xml元素反序列化更正为基元类型?