Pig - 如何迭代一袋地图

2024-03-07

让我解释一下这个问题。我有这行代码:

u = FOREACH persons GENERATE FLATTEN($0#'experiences') as j;
dump u;

产生以下输出:

([id#1,date_begin#12 2012,description#blabla,date_end#04 2013],[id#2,date_begin#02 2011,description#blabla2,date_end#04 2013])
([id#1,date_begin#12 2011,description#blabla3,date_end#04 2012],[id#2,date_begin#02 2010,description#blabla4,date_end#04 2011])

然后,当我这样做时:

p = foreach u generate j#'id', j#'description';
dump p;

我有这个输出:

(1,blabla)
(1,blabla3)

但这不是我想要的。我想要这样的输出:

(1,blabla)
(2,blabla2)
(1,blabla3)
(2,blabla4)

我怎么能有这个?

非常感谢。


我假设你是 $0FLATTENing in u是一个元组。

总体问题是j仅引用元组中的第一个映射。为了获得你想要的输出,你必须将每个元组转换成一个包,然后FLATTEN it.

如果您知道每个元组最多有两个映射,您可以执行以下操作:

-- My B is your u
B = FOREACH A GENERATE (tuple(map[],map[]))$0#'experiences' AS T ;
B2 = FOREACH B GENERATE FLATTEN(TOBAG(T.$0, T.$1)) AS j ;

C = foreach B2 generate j#'id', j#'description' ;

如果您不知道元组中有多少个字段,那么这将是much harder.


NOTE:这适用于猪 0.10。

对于具有未定义数量的映射的元组,我能想到的最佳答案是使用 UDF 来解析字节数组:

myudf.py

@outputSchema('vals: {(val:map[])}')
def foo(the_input):
    # This converts the indeterminate number of maps into a bag.
    foo = [chr(i) for i in the_input]
    foo = ''.join(foo).strip('()')
    out = []
    for f in foo.split('],['):
        f = f.strip('[]')
        out.append(dict((k, v) for k, v in [ i.split('#') for i in f.split(',')]))
    return out

myscript.pig

register 'myudf.py' using jython as myudf ;
B = FOREACH A GENERATE FLATTEN($0#'experiences') ;

T1 = FOREACH B GENERATE FLATTEN(myudf.foo($0)) AS M ;
T2 = FOREACH T1 GENERATE M#'id', M#'description' ;

然而,这依赖于这样一个事实:#, ,, or ],[不会出现在映射中的任何键或值中。


NOTE:这适用于猪 0.11。

因此,在这种情况下,pig 处理 python UDF 输入的方式似乎发生了变化。而不是将字节数组作为输入foo,字节数组会自动转换为适当的类型。在这种情况下,一切都会变得更加容易:

myudf.py

@outputSchema('vals: {(val:map[])}')
def foo(the_input):
    # This converts the indeterminate number of maps into a bag.
    out = []
    for map in the_input:
        out.append(map)
    return out

myscript.pig

register 'myudf.py' using jython as myudf ;

# This time you should pass in the entire tuple.
B = FOREACH A GENERATE $0#'experiences' ;

T1 = FOREACH B GENERATE FLATTEN(myudf.foo($0)) AS M ;
T2 = FOREACH T1 GENERATE M#'id', M#'description' ;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pig - 如何迭代一袋地图 的相关文章

随机推荐

  • 像 Matlab 一样的 gnuplot ytics 表示法

    我想设置 ytics 符号 就像这个 Matlab 图 图形框上只有一个 x10 5 一样 是否可以 你当然可以这样做by hand在 gnuplot 中 使用enhanced许多终端的选项并设置label set terminal png
  • 无法理解 a = b = 0 的目的;

    我目前正在阅读 Java 初学者指南 书中的某些地方有一段代码让我感到困惑 但我找不到它的作用的解释 int a int b a b 0 This is the line I don t understand 我所理解的是 0 的值被复制到
  • 如何使数据库大小超过 256 字节 [链接器文件 - MPLAB ]

    我有 PIC18F87J11 系列 并且正在使用 MPLAB C18 编译器 我可以给以下变量的最大字节是多少 我知道我必须修改链接器文件才能达到 256 字节以上 pragma udata CONNECTION TABLE 这是我干净的链
  • Scala 中的执行上下文是什么?

    我是 Scala 新手 正在尝试使用一些并行结构 Future尤其 我发现有一个类型的隐式参数ExecutionContext IMO 它类似于 并且可能比 线程池的概念 我试图通过学习它文档 http docs scala lang or
  • Microsoft UI 自动化教程/参考 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我最近使用 Microsoft Accessibility API 实现了一个程序 但后来被告知新的
  • 使用双重哈希时,最佳的第二哈希函数是什么?

    我在一些人们使用的论坛上看到 7 key mod 7 or 6 key mod 6 这用于为任何大的键值计算双哈希的第二个哈希函数 使用 6 甚至不是素数 或 7 有什么重要性吗 或者它只是随机生成一些值 与线性探测和二次探测不同 参考 h
  • nbconvert 多索引数据帧到乳胶

    我正在尝试使用 ipython 的 nbconvert 将多索引 Pandas DataFrame 导出到乳胶 但多索引行结果都是错误的 我在代码开头使用以下代码来正确转换为乳胶 我在 SO 上的某个地方找到了它 但不记得在哪里 from
  • ViewPager内的ScrollView,自动滚动到中间

    我有一个 ViewPager 其中包含同一片段的多个实例 该片段包含一篇文章 文章视图层次结构非常简单 一个标题 一个横幅图像 一个副标题和一个正文 除了标题之外的所有内容都包含在滚动视图中 问题是 当您滑动到新页面时 片段会在顶部显示视图
  • 如何在每次测试后重置 Django 测试数据库 ID?

    我有一个 django 应用程序 我正在其上运行一些单元测试 所以我遇到的问题不是当一个测试插入测试数据库时 这是随后的测试 由于每个测试都不保存交易 因此先前测试的条目不存在这很好 尽管自动增量 id 正在增加 就好像数据库中仍然有条目一
  • 如何在 Svelte/Sapper 应用程序中包含 JQuery?

    有许多组件仍然需要我需要使用的 JQuery 不幸的是 在 Svelte Sapper 中执行此操作的最佳方法是什么 我应该使用 ES6 导入 修改汇总 还是最好的方法是什么 例如 我需要包含来自 DevExpress 或 Kendo UI
  • 在 grails 插件安装期间无法解决依赖关系

    我从 PC 中删除了 grails 文件夹 当我在 Intellij IDE 中打开应用程序时 buildConfig groovy 中提到的插件开始安装 安装了一些插件 但有六个插件无法安装 发生以下错误 C Program Files
  • 使用首选项在运行时更改语言 [android]

    我读了几遍官方指南 http developer android com guide topics ui settings html对于这个 以及许多其他的东西 比如这个网站上的问题 但我不能让我的工作 100 截至目前 如果我更改列表首选
  • 有人可以准确解释如果在堆上分配对象数组的过程中抛出异常会发生什么吗?

    我定义了一个类 foo 如下 class foo private static int objcnt public foo if objcnt 8 throw outOfMemory No more space else objcnt cl
  • 类型 存在于两个 DLL 中

    我在 Net 3 5 框架中有 1 个 DLL 在 2 0 框架中有另一个 DLL 这ListBoxItem类存在于 2 0 中 我已将 3 5 DLL 中的类链接到同一命名空间中 当我尝试编译时 出现 两者都存在 错误 我怎样才能编译它并
  • 使用 StaticResources 测试 WPF 窗口

    我有一个简单的窗口 其中引用了 App xaml 中的 StaticResource App xaml资源定义 使用资源的窗口组件
  • 项目参考条件包含多个条件

    这是我的 csproj 文件的片段
  • 如何在行号视图中激活修订信息

    我知道 Eclipse 有一个功能可以显示行号视图中一行的最后更改的修订信息 渐变着色 更多信息 如修订号 日期和鼠标悬停时的作者 有谁知道如何默认激活文件的此功能 甚至更好 我最近不小心点击了一些快捷方式 使其显示在一个文件中 但它不会显
  • Safari 模糊了奇怪的错误

    我目前正在重新设计我的一个网站 我使用 CSS 模糊滤镜 blur blur 5px webkit filter blur 5px 和一些 CSS 动画 animate blur transition 0 45s all ease out
  • 在 PowerShell 窗口中运行应用程序

    我正在尝试放弃命令提示符 因为它是一个死胡同 转向 PowerShell ISE 我还没有弄清楚如何在 PowerShell ISE 窗口中运行命令行应用程序 每次我使用 开始进程 时 都会出现 然后消失 命令提示符窗口 我看到有些人建议
  • Pig - 如何迭代一袋地图

    让我解释一下这个问题 我有这行代码 u FOREACH persons GENERATE FLATTEN 0 experiences as j dump u 产生以下输出 id 1 date begin 12 2012 descriptio