首页 文章 精选 留言 我的

精选列表

搜索[SpringBoot4],共10000篇文章
优秀的个人博客,低调大师

4.python合并excel多个sheet

#用python实现将三个excel合并成一个excel #第一个测试文件 第二个测试文件 第三个测试文件 # 其中每个文件中有多个sheet,需要将其全部合并 import xlrd,xlsxwriter #设置要合并的所有文件 allxls=["/Users/xubin/myapp/pythonfile/第一个测试文件.xlsx","/Users/xubin/myapp/pythonfile/第二个测试文件.xlsx","/Users/xubin/myapp/pythonfile/第三个测试文件.xlsx"] #设置合并到的文件 endxls ="/Users/xubin/myapp/pythonfile/endxls.xlsx" #打开表格 def open_xls(file): try: fh=xlrd.open_workbook(file) return fh except Exception as e: print(str("打开出错,错误为:"+e)) #获取所有sheet def getsheet(fh): return fh.sheets() #读取某个sheet的行数 def getnrows(fh,sheet): table=fh.sheets()[sheet] content=table.nrows return content #读取某个文件的内容并返回所有行的值 def getfilect(fh,fl,shnum): fh=open_xls(fl) table=fh.sheet_by_name(shname[shnum]) num=getnrows(fh,shnum) lenrvalue=len(rvalue) for row in range(0,num): rdata=table.row_values(row) rvalue.append(rdata) print(rvalue[lenrvalue:]) filevalue.append(rvalue[lenrvalue:]) return filevalue #存储所有读取的结果 filevalue=[] #存储一个标签的结果 svalue=[] #存储一行结果 rvalue=[] #存储各sheet名 shname=[] #读取第一个待读文件,获得sheet数 fh=open_xls(allxls[0]) sh=getsheet(fh) x=0 for sheet in sh: shname.append(sheet.name) svalue.append([]) x+=1 #依次读取各sheet的内容 #依次读取各文件当前sheet的内容 for shnum in range(0,x): for fl in allxls: print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个标签的…") filevalue=getfilect(fh,fl,shnum) svalue[shnum].append(filevalue) #print(svalue[0]) #print(svalue[1]) #由于apped具有叠加关系,分析可得所有信息均在svalue[0][0]中存储 #svalue[0][0]元素数量为sheet标签数(sn)*文件数(fn) sn=x fn=len(allxls) endvalue=[] #设置一个函数专门获取svalue里面的数据,即获取各项标签的数据 def getsvalue(k): for z in range(k,k+fn): endvalue.append(svalue[0][0][z]) return endvalue #打开最终写入的文件 wb1=xlsxwriter.Workbook(endxls) #创建一个sheet工作对象 ws=wb1.add_worksheet() polit=0 linenum=0 #依次遍历每个sheet中的数据 for s in range(0,sn*fn,fn): thisvalue=getsvalue(s) tvalue=thisvalue[polit:] #将一个标签的内容写入新文件中 for a in range(0,len(tvalue)): for b in range(0,len(tvalue[a])): for c in range(0,len(tvalue[a][b])): #print(linenum) #print(c) data=tvalue[a][b][c] ws.write(linenum,c,data) linenum+=1 #叠加关系,需要设置分割点 polit=len(thisvalue) wb1.close()

优秀的个人博客,低调大师

Hadoop-No.4之列式存储格式

列式系统可提供的优势对于查询内容之外的列,不必执行I/O和解压(若适用)操作非常适合仅访问小部分列的查询.如果访问的列很多,则行存格式更为合适相比由多行构成的数据块,列内的信息熵更低,所以从压缩角度来看,列式存储通常会非常高效.换句话说,同一列中的数据比行存数据块中的数据更为相似.当某一列的取值不多是,行存与列存在压缩效果上的差异尤为显著数据仓库类型的应用需要在极大的数据集上对某些特定的列进行聚合操作,而列式存储格式通常很适合此类应用场景显然,列式文件格式也常常出现在Hadoop的应用中.Hadoop支持的列式格式包括一度广泛应用为Hive格式的RPFile,以及其他格式,如ORC(Optimized Row Columnar),以及Parquet等. RCFileRCFile专为高效处理MapReduce应用程序而开发,尽管在时间过程中,它一般只作为Hive存储格式使用.RCFile的开发旨在快速加载和查询数据,以及更高效的利用存储空间.RCFile格式将文件按行进行分片,每个分片按列存储. 与SequenceFile相比,RCFile格式在查询与压缩性能方面有很多优势.但这种格式也存在一些缺陷,会阻碍查询时间和压缩空间的进一步优化.这些问题很多都可以由更为新型的列式存储格式(比如ORC与Parquet)化解.大部分不断涌现的应用很有可能放弃使用RCFile,改用新型的列存格式.不过,RCFile目前仍然是Hive中常用的存储格式. ORCORC格式的开发初中是为了弥补RCFile格式方面的一些不足,尤其是查询性能和存储效率方面的缺陷.相比RCFile,ORC格式在很多方面都有显著进步,其特点和优势如下. 通过特定类型(type-specific)的reader与writer提供轻量级的,在线的(always-on)压缩.ORC还支持使用zlib,LZO和Snappy压缩算法提供进一步的压缩能够将谓词下推至存储层,仅返回查询所需要的数据支持Hive类型的模型,包括新增的decimal类型与复杂类型.支持分片ParquetParquet和ORC有很多相同的设计目标,但是Parquet有意成为Hadoop上的通用存储格式.Parquet的目标是成为能够普遍应用于不同MapReduce接口(如Java,Hive与Pig)的格式,同事也要适应其他处理引擎(如Impala与Spark).Parquet的优势如下,其中很多优势与ORC相同 与ORC文件类似,Parquet允许金返回需要的数据字段,因此减少了I/O,提升了性能提供高效的压缩,可以在每列上指定压缩算法设计的初衷便是支持复杂的嵌套数据结构在文件尾部有完整的元数据信息存储,所以Parquet文件是自描述的完全支持通过Avro和Thrift API写入与读取使用可扩展的高效编码模式,比如 按位封装(bit-packaging)和游程编码(Run Length Encoding,RLE)不同文件格式的失败行为不同文件格式之间一个重要的差异在于如何处理数据错误,某些格式可以更好的处理文件损坏. 列式格式虽然高效,但是在错误处理方面表现并不是很好,这是因为文件损毁可能导致行不完全.序列化格式在第一个出错的行之前能够正常读取,但是在随后的行中无法恢复Avro的错误处理能力最强,出现错误记录时,读操作将在下一个同步点(syncpoint)继续,所以错误只会影响文件的一部分

优秀的个人博客,低调大师

C++ template 学习归纳总结4

我们在这篇文章来说说typename关键字吧。这个关键字是在c++的标准化过程中引入的,目的在于说明template中的某个表示符号是一个类型,而不是其他的东西,看下面的代码: template <typename T> class MyClass { typename T::SubType * ptr; … }; 第一个typename我就不多说了,大家都知道,我来说一下第二个。他的意思是说T::SubType是class T内部定义的一个类型,从而ptr是一个指向【T:SubType类型】的指针。 如果在上面的代码中,没有第二个typename关键字的话,编译器会以为SubType是class Type的一个static成员。于是会被编译器理解为一个具体的东西,从而导致T::SubType * ptr 所表达的意思是两个数进行相乘。 关于这个知识的应用比较多的是STL中,比如: #include <iostream> // print elements of an STL container template <typename T> void printcoll (T const& coll) { typename T::const_iterator pos; // iterator to iterate over coll typename T::const_iterator end(coll.end()); // end position for (pos=coll.begin(); pos!=end; ++pos) { std::cout << *pos << ' '; } std::cout << std::endl; } 下面我们来看看另外一个有意思的问题。那就是”.template”,大家仔细查看下面的代码: template<int N> void printBitset (std::bitset<N> const& bs) { std::cout << bs.template to_string<char,char_traits<char>, allocator<char> >(); } 大家注意到没有,。这个例子中的“.template”比较怪,但是如果没有他的话,那么编译器无法知道后面的“<”是模板参数的开始。而不是一个小于号。注意,只有当位于 点号之前的物件取决于某一个template parameter的时候,这种情况才会发生,以上的例子中,bs受控于N。也就是显式指明模板函数调用。可以理解为指名点姓的调用模板成员函数而非普通的。 结论是“.template”或者”->template”记号只能在templates中使用。而且他们必须紧跟在于template parameter相关的某个物件。 其实这里关于这个”.template”,笔者也没有搞懂,不知道哪位大牛搞懂了,麻烦指教一下,谢谢了。 下面我们来看看成员模板: 先看看下面的例子: Stack<int> intStack1, intStack2; // stacks for ints Stack<float> floatStack; // stack for floats … intStack1 = intStack2; // OK: stacks have same type floatStack = intStack1; // ERROR: stacks have different types 默认的赋值运算要求左右两边拥有相等的类型。但是如果把赋值运算定义为一个模板,就可以使得类型不同,但是元素可以隐式转换,比如: template <typename T> class Stack { private: std::deque<T> elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); } // assign stack of elements of type T2 template <typename T2> Stack<T>& operator= (Stack<T2> const&); }; 我们来实现它看看:关键代码如下: template <typename T> template <typename T2> Stack<T>& Stack<T>::operator= (Stack<T2> const& op2) { if ((void*)this == (void*)&op2) { // assignment to itself? return *this; } Stack<T2> tmp(op2); // create a copy of the assigned stack elems.clear(); // remove existing elements while (!tmp.empty()) { // copy all elements elems.push_front(tmp.top()); tmp.pop(); } return *this; } 下面我们测试一下啊: Stack<int> intStack; // stack for ints Stack<float> floatStack; // stack for floats … floatStack = intStack; // OK: stacks have different types, // but int converts to float 当然这个运算并不改变stack和其元素的类型,赋值完成转换,floatstack返回的任然是float。但是这个技术并不是说任何两个类型都能进行赋值,比如下面的代码就不行: Stack<std::string> stringStack; // stack of ints Stack<float> floatStack; // stack of floats … floatStack = stringStack; // ERROR: std::string doesn't convert to float 你知道为什么了吗? 当然,和以前一样,你也可以在将内部容器的类型也参数化: template <typename T, typename CONT = std::deque<T> > class Stack { private: CONT elems; // elements public: void push(T const&); // push element void pop(); // pop element T top() const; // return top element bool empty() const { // return whether the stack is empty return elems.empty(); } // assign stack of elements of type T2 template <typename T2, typename CONT2> Stack<T,CONT>& operator= (Stack<T2,CONT2> const&); }; 此时的赋值运算实现代码为: template <typename T, typename CONT> template <typename T2, typename CONT2> Stack<T,CONT>& Stack<T,CONT>::operator= (Stack<T2,CONT2> const& op2) { if ((void*)this == (void*)&op2) { // assignment to itself? return *this; } Stack<T2> tmp(op2); // create a copy of the assigned stack elems.clear(); // remove existing elements while (!tmp.empty()) { // copy all elements elems.push_front(tmp.top()); tmp.pop(); } return *this; } ============================================================================== 本文转自被遗忘的博客园博客,原文链接:http://www.cnblogs.com/rollenholt/archive/2012/03/08/2384871.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

4 weekend110的hive入门

Hive和HBase都很重要,当然啦,各自也有自己的替代品。 在公司里,SQL有局限,大部分时候,不需写mr程序的,用hive这个工具。 公司里的懂java开发员工不一定每个公司都有,但懂SQL开发员工很多。 Hive的替代品:impala、spark shark、spark sql… Hive、impala 、spark shark、spark sql l…。相比,Hive是最慢的,因为,它是依赖mapreduce框架。 Hive是把SQL语言,翻译成mapreduce程序。 Spark sql是把SQL语言,翻译成spark程序。 注意啊,hive只是一个工具,你给它一个SQL程序,它就翻译成mapreduce程序,提交给集群去运行。 在一个节点上,安装一个hive、两个hive、三个hive、、、 以上是weekend110的hive入门 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5902757.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker容器进入的4种方式

在使用Docker创建了容器之后,大家比较关心的就是如何进入该容器了,其实进入Docker容器有好几多种方式,这里我们就讲一下常用的几种进入Docker容器的方法。 进入Docker容器比较常见的几种做法如下: 使用docker attach 使用SSH 使用nsenter 使用exec 一、使用docker attach进入Docker容器 Docker提供了attach命令来进入Docker容器。 接下来我们创建一个守护态的Docker容器,然后使用docker attach命令进入该容器。 $sudodockerrun-itdubuntu:14.04/bin/bash 然后我们使用docker ps查看到该容器信息,接下来就使用docker attach进入该容器 $sudodockerattach44fc0f0582d9 可以看到我们已经进入到该容器中了。 但在,使用该命令有一个问题。当多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示。如果有一个窗口阻塞了,那么其他窗口也无法再进行操作。 因为这个原因,所以docker attach命令不太适合于生产环境,平时自己开发应用时可以使用该命令。 二、使用SSH进入Docker容器 在生产环境中排除了使用docker attach命令进入容器之后,相信大家第一个想到的就是ssh。在镜像(或容器)中安装SSH Server,这样就能保证多人进入 容器且相互之间不受干扰了,相信大家在当前的生产环境中(没有使用Docker的情况)也是这样做的。但是使用了Docker容器之后不建议使用ssh进入到Docker容 器内。关于为什么不建议使用,请参考如下文章: 为什么不需要在 Docker 容器中运行 sshd 三、使用nsenter进入Docker容器 在上面两种方式都不适合的情况下,还有一种比较方便的方法,即使用nsenter进入Docker容器。关于什么是nsenter请参考如下文章: https://github.com/jpetazzo/nsenter 在了解了什么是nsenter之后,系统默认将我们需要的nsenter安装到主机中 如果没有安装的话,按下面步骤安装即可(注意是主机而非容器或镜像) 具体的安装命令如下: $wgethttps://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz $tar-xzvfutil-linux-2.24.tar.gz $cdutil-linux-2.24/ $./configure--without-ncurses $makensenter $sudocpnsenter/usr/local/bin 安装好nsenter之后可以查看一下该命令的使用。 nsenter可以访问另一个进程的名称空间。所以为了连接到某个容器我们还需要获取该容器的第一个进程的PID。可以使用docker inspect命令来拿到该PID。 docker inspect命令使用如下: $sudodockerinspect--help inspect命令可以分层级显示一个镜像或容器的信息。比如我们当前有一个正在运行的容器 可以使用docker inspect来查看该容器的详细信息。 $sudodockerinspect44fc0f0582d9 由其该信息非常多,此处只截取了其中一部分进行展示。如果要显示该容器第一个进行的PID可以使用如下方式 $sudodockerinspect-f``.`State`.`Pid`44fc0f0582d9 在拿到该进程PID之后我们就可以使用nsenter命令访问该容器了。 $sudonsenter--target3326--mount--uts--ipc--net--pid $sudonsenter--target3326--mount--uts--ipc--net--pid 其中的3326即刚才拿到的进程的PID 当然,如果你认为每次都输入那么多参数太麻烦的话,网上也有许多做好的脚本供大家使用。 地址如下: http://yeasy.gitbooks.io/docker_practice/content/container/enter.html http://www.tuicool.com/articles/eYnUBrR 四、使用docker exec进入Docker容器 除了上面几种做法之外,docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用: $sudodockerexec--help 接下来我们使用该命令进入一个已经在运行的容器 $sudodockerps $sudodockerexec-it775c7c9ee1e1/bin/bash 本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/1969635

优秀的个人博客,低调大师

Laravel 学习路线【4】控制器

控制器简介 控制器可以将相关的HTTP 请求封装到一个勒种进行处理,控制器目录在 app/Http/Controllers 目录中 定义控制器 <?php namespace App\Http\Controllers; use App\User; use App\Http\Controlelrs\Controller; class UserController extends Controller { //为指定用户显示详情 public function show($id) { return view('user.profile',['user' => User::findOrFail($id)]); } } 我们可以这样定义路由 Route::get('user/{id}','UserController@show'); 如果一个请求匹配到上面URI UserController 的 show 方法就会被执行。路由参数也会传递给当前方法 单动作控制器 如果你想定义一个只处理一个动作的控制器,可以在控制器中定义 __invoke 方法。 <?php namespace App\Http\Controllers; use App\User; use App\Http\Controllers\Controller; class ShowProfile extends Controller { public function __invoke($id) { return view('user.profile',['users' => findOrFail($id)]); } } 当你为这个单动作控制器注册路由的时候,不需要指定方法: Route::get('user/{id}','ShowProfile'); 控制器中间件 中间件可以像这样分配给控制器路由 Route::get('profile','UserController@show')->middleware('auth'); 但是,将中间件放在控制器构造函数中更方便,在控制器的构造函数中使用 middleware 方法你可以很轻松的分配中间件给该控制器。 class UserController extends Controller { //实例化一个新的UserController 实例 public function __construct() { $this->middleware('auth'); $this->middleware('log')->only('index'); $this->middleware('subscribed')->except('store'); } } 在控制器中还可以使用闭包注册中间件,这为我们定义只在某个控制器中使用中间件提供了方便,无需定义完整的中间件类: $this->middleware(function($request,$next){ return $next($request); }) 注:你还可以将中间件分配给多个控制器动作,不过,这意味着你的控制器会变得越来越臃肿,这种情况下,需要考虑将控制器分割成多个更小的控制器。

优秀的个人博客,低调大师

大数据开发—常见问题(4

Q:MaxCompute 中有没有类似 hive 里面 grouping sets 的功能?A:暂时不支持grouping sets函数,您可以考虑使用udaf实现, 或者您可以使用union all 来迂回解决 Q:如下图的工作流处理流程, 是要 aa 和 bb 都完成后才会执行 cc 吗?aa 和 bb 是否会同步执行? A:首先 aa 和 bb 都完成后才会执行 cc;其次,如果没有资源在等待执行,那么 aa 和 bb 会同步执行。 Q:是否可以在创建 MaxCompute 表时,设置一个自增的字段?A: MaxCompute 目前不支持自增字段,也不支持主键。 Q: 登录阿里云官网时,出现下图情况该怎么办? A: 清除下 cookie 再登录,如果不行可以选择隐身模式登录。 Q: datax 增量同步时有自增 id, where 该

优秀的个人博客,低调大师

Android 基础课堂 - Lesson.4

Android 基础课堂 上周我们讲了Android里的五大布局,学会了五大布局就有了搭建一个界面的基础了,但是简单的用一种布局是不行的,真正的开发中,避免不了多种布局的嵌套,各布局的属性也比较多,这些都需要亲自动手去尝试尝试,才能真正的掌握。 本周的内容呢,就让我们来搭建我们的APP的第一个界面吧,那么我们从哪入手呢,在现在的APP中,大多数都是含有登录界面的,登录是大部分APP必不可少的一部分,所以呢,我们就从登录界面开始吧,那么,就让我们进入本周的基础课堂吧。 第四课、从登录界面开始 一、登录界面布局分析 首先我们先来创建一个新的Activity用于登录,首先打开我们的工程,然后在我们的包处右键,如下: 右键后弹出如下菜单,按下图进行选择,最后我们创建一个Empty Activity 我们将该Activity命名为LoginActiv

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册