guava读取配置文件_使用Guava MapSplitters配置Hadoop

guava读取配置文件

在本文中,我们将为通过Context对象将配置参数传递给Hadoop Mapper提供新的思路。 通常,我们在启动map-reduce作业时将配置参数设置为Context对象上的键/值对。 然后在Mapper中,我们使用键来检索要用于我们的配置需求的值。 不同之处在于,我们将在Context对象上设置一个特殊格式的字符串,并在Mapper中检索值时,使用Guava MapSplitter将格式化后的字符串转换为将用于获取配置参数的HashMap 。 我们可能会问自己为什么要去解决这个麻烦? 通过这种方式进行配置,我们可以在Context对象上设置单个键值对的情况下将多个参数传递给Mapper。 为了说明一种可能的用法,我们将回顾上一篇文章 ,其中介绍了如何执行减少侧连接。 该职位提出的解决方案存在两个问题。 首先,我们假设要加入的键始终是文件中带分隔符的字符串中的第一个值。 其次,我们假设每个文件使用相同的定界符。 如果我们要从密钥位于每个文件中不同位置的文件中加入数据,而某些文件使用不同的定界符怎么办? 另外,我们希望对输出的所有数据使用相同的定界符(如果有),而不考虑任何输入文件中使用的定界符。 尽管这是人为的情况,但它将很好地用于演示目的。 首先让我们研究一下MapSplitter类是什么以及如何使用它。

MapSplitter

MapSplitterSplitter类中的一个嵌套类。 Spitter接受一个字符串,并使用给定的定界符将其拆分为多个部分。 MapSplitter通过从字符串创建Map <String,String>进一步走了一步,该字符串的键值对用一个定界符分隔,而对值本身则完全用另一个定界符分隔。 让我们看一个例子:

Map<String,String> configParams = Splitter.splitOn("#").withKeyValueSeparator("=").split("6=June#7=July#8=August");

在上面的示例中,字符串"6=June#7=July#8=August"将被转换为Map,键6,7和8分别映射到June,July和August。 MapSplitter是一个非常简单但功能强大的类。 现在我们知道了MapSplitter工作原理,让我们看一下如何使用它来帮助我们为map-reduce作业设置配置参数

使用MapSplitter进行配置

以前,我们通过在Context对象中为map-reduce作业设置值,来将连接键的索引位置和分隔符设置为对所有文件相同。 现在,我们希望能够根据需要在每个输入文件的基础上进行设置。 我们仍将根据需要提供默认值。 为了完成此更改,我们将创建一个属性文件,该属性文件将文件名作为键,并且该值将是格式设置为MapSplitter使用的MapSplitter 。 我们的属性文件如下所示:

oneToManyEmployer2.txt=keyIndex=1&separator=|
oneToManyVehicles2.txt=keyIndex=1&separator=#

在这里,我们指示文件oneToManyEmployer2.txt在索引位置1处具有我们的连接键,而分隔符为“ |” 竖线字符和oneToManyVehicles2.txt文件在索引位置1处具有连接键,并使用“,”逗号作为分隔符。 我们将对驱动程序类进行一些更改。 首先,我们将加载属性文件(假设我们已将文件放置在相对于调用hadoop的目录中)。

InputStream inputStream = new FileInputStream(new File("./jobs/join-config.properties"));
Properties properties = new Properties();
properties.load(inputStream);

首先,我们定义一个常规的Splitter对象,该对象将在斜杠“ /”上拆分文件名。 接下来,当我们遍历文件名时,通过对从Splitter.split方法调用返回的Iterable对象调用Iterables.getLast来获得文件的基本名称。 然后,我们尝试在Properties.getProperty方法中为每个文件检索配置的属性字符串。 请注意,如果找不到文件的属性,我们还将传递defaultMapConfig变量,该变量提供默认值。 我们还添加了一些其他配置键和值。 将值连接在一起时使用的定界符以及文件的连接顺序,该顺序由文件在提供给程序的参数中的位置确定。 然后,我们仅使用文件名作为键将格式化后的字符串放入Context对象。

String defaultMapConfig = "keyIndex=0&separator=,";
Splitter splitter = Splitter.on('/');
for (int i = 0; i < args.length - 1; i++) {String fileName = Iterables.getLast(splitter.split(args[i]));String mapConfig = properties.getProperty(fileName, defaultMapConfig);builder.append(mapConfig).append("&joinDelimiter=,&joinOrder=").append(i + 1);config.set(fileName, builder.toString());builder.setLength(0);filePaths.append(args[i]).append(",");
}

使用配置值

要使用我们的配置值,我们首先必须检索存储为包含我们的配置参数的字符串的HashMap

private Splitter.MapSplitter mapSplitter = Splitter.on("&").withKeyValueSeparator("=");
.......
private Map<String,String> getConfigurationMap(Context context){FileSplit fileSplit = (FileSplit)context.getInputSplit();String configString = context.getConfiguration().get(fileSplit.getPath().getName());return mapSplitter.split(configString);}

在这里,我们使用MapSplitter实例变量,并通过使用此Mapper使用的文件名检索存储在Context的格式化字符串来创建HashMap 。 现在,我们可以简单地从映射中拉出所需的配置参数,如setup方法中所示:

protected void setup(Context context) throws IOException, InterruptedException {Map<String,String> configMap = getConfigurationMap(context);keyIndex = Integer.parseInt(configMap.get("keyIndex"));String separator = configMap.get("separator");splitter = Splitter.on(separator).trimResults();String joinDelimiter = configMap.get("joinDelimiter");joiner = Joiner.on(joinDelimiter);joinOrder = Integer.parseInt(configMap.get("joinOrder"));}

map方法中的代码与我们先前的文章中的代码相同。现在我们每个文件都具有完全可配置的设置,而且我们不限于将join键放在一个位置,也不必每个文件使用相同的定界符。 当然,这只是一个示例,但是此处概述的方法可用于配置许多其他设置,并且只需要Context对象中的一个键即可。

结果

最初,我们的数据如下所示:

oneToManyEmployer2.txt:

Creative Wealth|cdd8dde3-0349-4f0d-b97a-7ae84b687f9c
Susie's Casuals|81a43486-07e1-4b92-b92b-03d0caa87b5f
Super Saver Foods|aef52cf1-f565-4124-bf18-47acdac47a0e
.....

oneToManyVehicles2.txt:

2003 Holden Cruze#cdd8dde3-0349-4f0d-b97a-7ae84b687f9c
2012 Volkswagen T5#81a43486-07e1-4b92-b92b-03d0caa87b5f
2009 Renault Trafic#aef52cf1-f565-4124-bf18-47acdac47a0e
.....

singlePersonRecords.txt:

cdd8dde3-0349-4f0d-b97a-7ae84b687f9c,Esther,Garner,4071 Haven Lane,Okemos,MI
81a43486-07e1-4b92-b92b-03d0caa87b5f,Timothy,Duncan,753 Stadium Drive,Taunton,MA
aef52cf1-f565-4124-bf18-47acdac47a0e,Brett,Ramsey,4985 Shinn Street,New York,NY
......

运行我们的map-reduce作业后,结果看起来就像我们想要的一样:

08db7c55-22ae-4199-8826-c67a5689f838,John,Gregory,258 Khale Street,Florence,SC,2010 Nissan Titan,Ellman's Catalog Showrooms
0c521380-f868-438c-9916-4ab4ea76d316,Robert,Eversole,518 Stratford Court,Fayetteville,NC,2002 Toyota Highlander,Specialty Restaurant Group
1303e8a6-0085-45b1-8ea5-26c809635da1,Joe,Nagy,3438 Woodstock Drive,El Monte,CA,2011 Hyundai ix35,Eagle Food Centers
15360125-38d6-4f1e-a584-6ab9d1985ab8,Sherri,Hanks,4082 Old House Drive,Alexandria,OH,2003 Toyota Solara,Odyssey Records & Tapes
......

资源资源

  • Jimmy Lin和Chris Dyer 使用MapReduce进行的数据密集型处理
  • Hadoop: Tom White 的权威指南
  • 来自博客的源代码和测试
  • 编程蜂巢爱德华卡普里奥罗,院长Wampler和Jason拉瑟格伦
  • 通过Alan Gates 编程Pig
  • Hadoop API
  • MRUnit用于单元测试Apache Hadoop映射减少工作

参考: 《 随机编码》博客上的JCG合作伙伴 Bill Bejeck提供的使用Guava MapSplitters配置Hadoop 。

翻译自: https://www.javacodegeeks.com/2013/09/configuring-hadoop-with-guava-mapsplitters.html

guava读取配置文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346951.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用程序无法正常启动 0xc0150002

Visual Studio 2017在debug下运行程序报错 应用程序无法正常启动 0xc0150002 分析原因 可能是&#xff1a;原程序是低版本的VS所编写的&#xff0c;缺少低版本的运行库&#xff0c;所以报错 解决 安装了VS2010后即可正常运行 error LNK2019: 无法解析的外部符号 __vsnwprin…

Zuul 2 –样本过滤器

Zuul 2终于开源了 。 我第一次听到Zuul 2年Spring由米奇科恩一个2016的讲就是可以在这里找到 &#xff0c;这是好事&#xff0c;终于可以用它玩。 为了快速实现Zuul 2之类的网关的目的–网关提供了微服务生态系统的切入点。 由于所有客户的请求都是通过网关路由的&#xff0c;…

Excel之抽奖器实现

Excel实现一个抽奖器&#xff0c;关键在于学会几个Excel中的函数即可轻松实现。 单人抽奖 RANDBETWEEN 例&#xff1a; INDEX(A2:A61,RANDBETWEEN(1,60))缺点&#xff1a;这种方式生成的抽奖器&#xff0c;在多人情况下&#xff0c;由于RANDBETWEEN函数的返回值有可能是相同…

【RS码1】系统RS码编码原理及MATLAB实现(不使用MATLAB库函数)

关注公号【逆向通信猿】更精彩!!! 基础知识 要想搞懂本节知识,需要先熟悉掌握以下前几篇博客 【多元域乘法】多项式乘法电路原理及MATLAB详解 【多元域除法】多项式除法电路原理及MATLAB详解 RS码编码原理 RS码的编码与BCH码类似,区别在于RS码为多进制的 生成多项式…

【RS码2】RS码的BM迭代译码原理详解及MATLAB实现(不使用MATLAB库函数【全部代码需私信另外付费获取】)

理论基础 订阅《信道编码》专栏,首先查阅各子程序的详解 【有限域生成】本原多项式生成有限域的原理及MATLAB实现 【有限域除法】二元多项式除法电路原理及MATLAB详解 【有限域元素加法和乘法】有限域元素加法和乘法的原理及MATLAB实现 【多元域乘法】多项式乘法电路原理…

QT开发基础

QT中可以使用qmake来生成Makefile&#xff0c;由.pro文件生成Makefile的命令如下&#xff1a; qmake hello.pro -o Makefile make模板(TEMPLATE) 模板变量告诉qmake为这个应用程序生成哪种makefile。下面是可供使用的选择&#xff1a; app - 建立一个应用程序的makefile。这…

Shebang来Java了吗?

尽管添加对Unix风格的shebang &#xff08; #! &#xff09;的支持从来不是 JEP 330 [“启动单文件源代码程序”] 的中心目标 &#xff0c;但围绕JEP 330“单个文件源程序”的潜在功能存在一些问题。为了支持Unix风格的shebang &#xff0c;在OpenJDK jdk-dev邮件列表上引起了广…

【C++编程题1】数组指针之字符串排序

题目 用数组指针处理50个不等长字符串。写一个函数对字符串按降序排序&#xff0c;然后在主函数输入这50个字符串&#xff0c;调用函数后&#xff0c;再输出这50个已经排好序的字符串。 代码 子函数&#xff1a; #include <iostream> using namespace std; #define N…

如何用Java编写类似C的Sizeof函数

如果您刚开始学习Java并且是C语言背景&#xff0c;那么您可能已经注意到Java和C编程语言之间存在一些差异&#xff0c;例如String是Java中的对象&#xff0c;而不是NULL终止的字符数组。 同样&#xff0c;Java中没有sizeof&#xff08;&#xff09;运算符。 所有原始值都有预定…

【C++编程题2】字符串插入空格

题目 从键盘输入一个字符串&#xff0c;然后按照下面要求输出 从键盘输入一个字符串&#xff0c;然后按照下面要求输出一个新字符串&#xff1a;新串是在原串中的每两个字符之间插入一个空格&#xff0c;如原串为 abcd&#xff0c;则新串为a口b口c口d口&#xff08;口表示空格…

Spring启动教程

1.简介 如果您一直想使用一个Web框架&#xff0c;它使您能够快速开始API开发&#xff0c;而无须设置Web服务器&#xff0c;收集所有有线依赖项&#xff0c;安装各种工具的麻烦&#xff0c;那么您将拥有一个出色的框架&#xff0c;即Spring开机 Spring Boot的主要座右铭是约定优…

【LDPC系列1】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真

关注公号【逆向通信猿】更精彩!!! 1. 构造编码器对象 采用MATLAB内置的comm.LDPCEncoder构造编码器对象,其中使用默认的校验矩阵,信息位长32400比特,码长64800比特,该校验矩阵中除第一行中1的个数为6个外,其余行中1的个数均为7;前12960列中1的个数为8,后32400列构成…

【LDPC系列2】基于MATLAB中LDPC编译码器对象的图像传输通信系统仿真(IEEE 802.16e标准协议基础矩阵)

关注公号【逆向通信猿】更精彩!!! 1. 构造校验矩阵H,并保存为mat文件 采用IEEE 802.16e标准协议中的基础校验矩阵 通过构造QC-LDPC校验矩阵,码长n=2304,信息长k=1152,码率r=1/2,基础矩阵维数为1224: Hb = [-1 94 73 -1

.xhr长轮询_使用Spring 3.2的DeferredResult进行长轮询

.xhr长轮询在我们的最后一集中 &#xff0c; Agile Cowboys Inc.的首席执行官刚刚雇用了Java / Spring顾问&#xff0c;方法是为他提供最初为女友购买的保时捷。 这位首席执行官的女友因失去保时捷而感到不安&#xff0c;已将其婚外恋告诉了他的妻子。 他的妻子在分拆了CEO的套…

十进制数与八进制数互相转换(MATLAB和C版本)

一、八进制数转十进制数 C语言实现 实现思路和参数: /* Function: ConvertOctaltoDecimal* Abstract: Convert an octal number to its equivalent decimal value** - First compute the number of digits in the octal number* - Then perform the conversion, one …

Java正成为COBOL的一部分-它将成为COBOL的一部分吗?

任何从大学&#xff0c;技术学校或社区学院毕业的计算机科学专业都接受过培训。 每个身材高大的公司都使用该语言&#xff0c;并拥有一批具备此能力的程序员。 通用语言可以推动业务发展。 1985年是COBOL。今天是Java。 尽管存在差异&#xff0c;但这两种语言在行为轨迹上都具…

VS2010附加进程调试DLL时断点无法断下的解决方法

系统版本&#xff1a;Win10 x64 1809 VS版本&#xff1a;VS2017 企业版 问题一 在动态链接库(DLL)附加到进程调试时&#xff0c;用VS2017附加后单步调试&#xff0c;结果发现总是在调试过程中卡死&#xff0c;VS2017无响应&#xff1b; 解决办法是&#xff1a;强制结束VS2017…

MATLAB库函数polly2trellis(卷积码生成多项式转网格图描述)的实现过程详解

关注公号【逆向通信猿】更精彩!!! 生成多项式转网格图 在MATLAB中,卷积码的维特比(Viterbi)译码实现通常需要先将生成多项式转换成网格图描述,然后才能利用网格图进行维特比译码 生成多项式转网格图描述的built-in函数为poly2trellis,在MATLAB中,改函数为通信工具箱…

java反射api研究_深入研究Java 8中的可选类API

java反射api研究作为Java程序员&#xff0c;我们所有人都经历了以下情况&#xff1a;我们调用一个方法来获取某个值&#xff0c;然后代替直接对返回值调用某些方法&#xff0c;我们首先必须检查返回值是否不为null&#xff0c;然后在返回值。 这是像Guava这样的外部API试图解决…

【卷积码系列1】(n,k,m)卷积码的编码原理详解及MATLAB实现

关注公号【逆向通信猿】更精彩!!! 原理 编码电路图 ( n , k , m ) (n,k,m) (n,k,