Storm-declareOutputFields-declare

本文介绍了在Storm中,不论是Spout还是Bolt的declareOutputFields方法的作用。该方法用于定义元组中变量的结构名称。通过示例,解释了如何在Spout和Bolt中使用此方法发送包含多个变量的元组,并澄清了Values类与ArrayList的关系,帮助理解元组数据的组织方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目需要开始接触storm,感觉跟spark差距还是不小的,不过每个平台都有各自的优势,不做过多评价。有个地方,一直困扰了我好久,就是不管是spout实现类还是bolt实现类里面都有个declareOutputFields的方法,后面declare出去的东西我是真看不明白有啥用,然后按照官网看了一下,结合自身理解在此梳理一下,如果有同学有同样的问题希望能给你解惑。

如图,这是我的spout中粘贴出来的。就拿这个例子来说,我首先粘上官方的解释:

The stream is the core abstraction in Storm. A stream is an unbounded sequence of tuples that is processed and created in parallel in a distributed fashion. Streams are defined with a schema that names the fields in the stream's tuples. By default, tuples can contain integers, longs, shorts, bytes, strings, doubles, floats, booleans, and byte arrays. You can also define your own serializers so that custom types can be used natively within tuples.
Every stream is given an id when declared. Since single-stream spouts and bolts are so common,  OutputFieldsDeclarer  has convenience methods for declaring a single stream without specifying an id. In this case, the stream is given the default id of "default".
具体解释我不多说,我只说核心:流定义元组中变量结构的名字,同时如果流不指定id的话,会有个默认id:default。

 然后带领大家看一下API(java):


那么很明显了,我们知道最顶部调用了第二种方法,也就是他们使用默认的流ID:default。那么这个Fields:word有什么用呢,上面官网说了,他是定义元组中变量结构的名字。我们都知道spout每次调用他的nextTuple方法,他会向着流发送一个元组,那么这个元组里面包含的变量我们不管他是什么类型,她都需要一个名字,我们这里起名字叫做word。返回我们看我是否发送了一个变量:


     没毛病,每次发送一个随机的字符串。现在大家可能对这个方法有了深入点的了解,练习一下,在bolt中,如果我发送很多变量呢:


   tuple是一个静态的方法,具体实现如下:


   其实就是对传入里面的对象封装到一个列表中,返回列表。那么我们declare的时候如何写呢,理论上我们返回了两个变量:


没错就是这么写,我们传入两个参数来分别命名tuple中两个变量。

可能有心人发现了问:楼主你就扯淡吧,下面bolt返回的是ArrayList,那上面返回的是new Values,这俩根本没有可比性好吗。

同学说的好,其实两者虽然调用的类不同,不过两条路线还真是出奇的相似,我们看一下Values类:

他其实也是把new Values里面的东西放入了ArrayList中,如果多个变量的话,declare的时候也声明多个变量名字,我之所以练习的时候给大家讲bolt是为了扩展,记住两者绝非调用相同的emit,spout调用的是:

SpoutOutputCollector
而我这里的bolt调用的是:

BasicOutputCollector
只不过里面走的过程十分相似,在此与大家分享分享,如果我哪里说错了欢迎大神请教,免得误导大家。

感谢开源。

<think>好的,用户现在想了解在Bash中使用`declare -A`定义关联数组的用法。首先,我需要回顾一下之前提供的引用内容,看看里面有哪些相关信息。根据引用[1],Bash支持两种数组:索引数组和关联数组。关联数组需要用`declare -A`来声明。引用[2]和[3]都提到了如何声明关联数组,并给出了具体例子。比如,`declare-Aa=(["a"]=apple ["b"]=boy)`这样的语法。引用[4]和[5]则展示了关联数组的实际应用,比如读取配置文件或收集系统信息。用户之前的问题中已经涉及了关联数组的定义,现在需要更详细地解释`declare-A`的用法。可能需要分步骤说明:声明数组、赋值、访问元素、遍历键值对等。同时要注意在Bash版本4及以上才支持关联数组,这点需要提醒用户检查版本。 另外,用户可能对关联数组和普通索引数组的区别有疑问,需要明确两者的不同。例如,关联数组使用字符串作为下标,而索引数组用数字。同时,在声明时必须使用`-A`选项,否则会默认创建索引数组,导致错误。还要考虑用户的实际应用场景,比如如何动态添加元素,如何检查数组是否存在某个键,如何处理可能出现的错误。比如,在引用[5]中,通过循环读取配置文件到关联数组,这可以作为一个实用案例。需要确保回答结构清晰,分点说明,并给出代码示例。同时,引用相关的引用内容,比如在声明关联数组时引用[3],在示例中引用[4]和[5]的例子。最后,生成相关问题,如如何遍历关联数组,或者如何处理旧版本Bash不支持的情况。</think>### Bash中`declare -A`的用法与关联数组详解 在Bash脚本中,`declare -A`用于**声明关联数组**(Associative Array),即以字符串为索引的键值对集合。关联数组是Bash 4.0及以上版本引入的高级数据结构[^1][^3],适用于需要自定义键名的场景。 --- #### 一、关联数组的核心操作 1. **声明关联数组** 必须使用`declare -A`显式声明: ```bash declare -A fruits_color # 声明空关联数组 declare -A user_info=(["name"]="Alice" ["age"]=30) # 声明并初始化[^3] ``` 2. **赋值与修改** - 单元素赋值: ```bash fruits_color["apple"]="red" # 添加键值对 user_info["email"]="alice@example.com" # 修改或新增键[^4] ``` - 批量赋值: ```bash declare -A colors=(["red"]="#FF0000" ["green"]="#00FF00") # 初始化多键值[^3] ``` 3. **访问元素** ```bash echo ${fruits_color["apple"]} # 输出"red"[^4] echo "用户年龄:${user_info["age"]}" # 输出"30" ``` 4. **遍历操作** - 遍历所有键: ```bash for key in "${!user_info[@]}"; do echo "键:$key" done ``` - 遍历所有值: ```bash for value in "${user_info[@]}"; do echo "值:$value" done ``` --- #### 二、关键特性与注意事项 1. **与索引数组的区别** - 索引数组使用数字下标(如`arr[0]`),而关联数组允许任意字符串作为键(如`arr["key"]`)[^1][^3] - 索引数组默认无需声明,而关联数组必须通过`declare -A`声明[^3] 2. **版本兼容性** - 确认Bash版本≥4.0: ```bash echo $BASH_VERSION # 输出示例:5.0.17(1)-release ``` 3. **动态扩展性** 关联数组可动态添加或删除键值对,无需预定义大小: ```bash unset user_info["email"] # 删除键 ``` --- #### 三、实用案例:配置文件解析 ```bash #!/bin/bash declare -A config # 声明关联数组 # 从文件读取键值对 while IFS='=' read -r key value; do config["$key"]="$value" done < config.ini # 假设文件内容为host=localhost, port=8080[^5] # 输出配置项 echo "数据库地址:${config["host"]}" echo "端口号:${config["port"]}" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值