首页 文章 精选 留言 我的

精选列表

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

MaxCompute实践分析

概述本文主要是记录如何通过数加MaxCompute和大数据开发套件两个产品实现简单的电影数据分析。目标希望了解每天市场上最火爆的电影是哪些,表现如何。通过对影视及票房数据集(dwd_product_movie_basic_info电影基本信息 和 ods_product_movie_box票房基本信息)统计分析出每天每个国家/地区累计票房最高的10个电影并且展现这些电影的导演、主演和累计票房。数据说明直接使用了数加平台公开数据集上的影视及票房数据集。该数据集从2016 年12 月13 日开始,每日早10 点前进行全量更新。 两个表的具体信息如下: 电影基本信息 dwd_product_movie_basic_info 字段英文名 字段类型 描述 是否是分区列 movie_ name STRING 电影名称 dirctor STRING 导演 scriptwriter STRING 编剧 area STRING 制片地区/国家 actors STRING 主演 type STRING 类型 movie_length STRING 电影长度 movie_date STRING 上映日期 movie_language STRING 语言 imdb_ url STRING imdb号 ds STRING 日期 分区列 数据样例 Select * from public_data.dwd_product_movie_basic_info where ds ='20170119' limit 10; 票房基本信息 ods_product_movie_box 字段英文名 字段类型 描述 是否是分区列 rank STRING 排名 avgprice STRING 平均票价 avppeople STRING 场均人次 boxoffice STRING 单日票房(万) boxoffice_ up STRING 环比变化 (%) irank STRING 排名 movieday STRING 上映天数 moviename STRING 影片名 sumboxoffice STRING 累计票房(万) womindex STRING 口碑指数 ds STRING 日期 分区列 数据样例 Select * from public_data.ods_product_movie_box where ds ='20170119' limit 10; 目标分析 需要统计出每个国家/地区累计票房(万)最高的10个电影并且展现这些电影的导演和主演 包括的字段是 [ 制片地区/国家 、电影名称、 排名、累计票房(万)、导演、主演] 现状分析 电影基本信息表中包含了 [ 制片地区/国家、电影名称、 导演、主演 ] -票房基本信息表中包含了 [ 影片名、累计票房(万)], 其中的 [ 排名 ] 字段不是票房排名 -两个表中没有类似于 [ 影片ID ] 的字段 数据源中的数据每天都进行全量更新 实现路径 1 创建目标表 2 创建任务,通过 [ 电影名称 ] 和 [ 影片名 ] 建立两张表的连接,并按 [ 制片地区/国家 ] 进行分组,对 [ 累计票房(万)] 进行排名 3 配置调度,该任务每天调度一次 实现步骤 1 创建目标表 在大数据开发套件的数据开发标签的工具栏中,点击新建,在下拉菜单中选择新建表 输入建表语句 CREATE TABLE IF NOT EXISTS movie_sumboxoffice_top10 ( area STRING, movie_name STRING, movie_rank STRING, sumboxoffice STRING, dirctor STRING, actors STRING ) PARTITIONED BY ( ds STRING ); 点击确定提交 2 创建查询任务进行分析 这次在工具栏中选择新建任务,选择节点任务,ODPS_SQL类型和周期调度 编辑SQL代码,先测试一下。 --连接两张原表 --每天任务运行时都是取当天数据源的最新分区 DROP TABLE IF EXISTS t_movie_sumboxoffice_info; CREATE TABLE IF NOT EXISTS t_movie_sumboxoffice_info AS SELECT a.area , a.movie_name , b.sumboxoffice , a.dirctor , a.actors FROM public_data.dwd_product_movie_basic_info a JOIN (SELECT * FROM public_data.ods_product_movie_box WHERE ds = '${bdp.system.bizdate}')b ON a.movie_name = b.moviename WHERE a.ds = '${bdp.system.bizdate}'; 发现产生的表 t_movie_sumboxoffice_info是空的,原因是数据源的两张表里面并不是每一天都有数据的,做一下数据探查。 SELECT DISTINCT a.ds AS dt FROM public_data.dwd_product_movie_basic_info a JOIN public_data.ods_product_movie_box b ON a.ds = b.ds AND b.ds IS NOT NULL WHERE a.ds IS NOT NULL ORDER BY dt DESC LIMIT 365; 注意order by必须与limit 联用,且order bykey必须是select语句的输出列,即列的别dt。 当两个表进行join的时候,主表的Where限制可以写在最后,但从表分区限制条件要写在ON条件或者子查询,否则会先Join后进行分区裁切,造成不必要的性能下降。 得到的结果如下(截图中只显示了一部分) 最大日期是2017年6月30日,最小日期是2017年1月13日,其中还有不连续的现象。 所以现在看来每天有新的分析报告是不行了,那就对历史数据进行一下分析。需要调整一下系统参数,设置为其中较早的一天,比如2017年1月19日。 再次运行,得到的结果如下 看来是数据没有处理干净,存在属于同一部电影但主演名字不一样的情况。虽然这属于数据清洗的范畴,但是可以简单进行一下去重处理。 --用distinct和wm_concat聚合函数进行简单去重 DROP TABLE IF EXISTS tmp_movie_sumboxoffice_info; CREATE TABLE IF NOT EXISTS tmp_movie_sumboxoffice_info AS SELECT a.area , a.movie_name , a.sumboxoffice , a.dirctor , wm_concat(',', a.actors) as actors FROM ( SELECT distinct area , movie_name , sumboxoffice , dirctor , actors FROM t_movie_sumboxoffice_info ) a group by a.area , a.movie_name , a.sumboxoffice , a.dirctor; 去重后结果如下 现在可以继续编辑第三段SQL代码 --产出最终目标表:每个国家/地区总票房最高的10个电影,并展示导演和主演 --每天任务运行产出的日期分区值与源表数据日期一致 INSERT OVERWRITE TABLE movie_sumboxoffice_top10 PARTITION (ds = '${bdp.system.bizdate}') SELECT a.area , a.movie_name , a.movie_rank , a.sumboxoffice , a.dirctor , a.actors FROM ( SELECT area , movie_name , ROW_NUMBER() OVER (PARTITION BY area ORDER BY sumboxoffice DESC) AS movie_rank , sumboxoffice , dirctor , actors FROM tmp_movie_sumboxoffice_info ) a WHERE a.movie_rank < 11; 这里用一个窗口函数Row_number 对 area 开窗, 按照 sumboxoffice 从大到小进行排名 最终得到结果如下只有这么可怜的几条数据,选的日子不够好。而且为什么排名第二的票房是6291?感觉似乎少了1个0,感兴趣的同学可以研究一下为什么,或者留言指出我的错误。3 配置调度 虽然数据不完整,但是还是可以配置一下调度由于本例中没有依赖其他任务,所以只需要配置调度周期,而且由于是每天调度一次,直接保留默认配置即可。 总结整个任务基本上完成,虽然数据不太完整。从去年接触MaxCompute到现在,虽然使用的频率还不够多,但是能感受到功能越来越完善。比如费用预估就是一个非常赞的功能,用户体验大大上升,跑代码的时候心理压力小了很多。公司的OLTP目前是建立在SQL Server 上, 未来可能有迁移数据仓库到MaxCompute的打算。如果有机会的话,到时候再来跟大家分享,包括一些MaxCompute更高级的功能。

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

hbase优化实践

hbase优化 一:垃圾回收优化 : region服务器处理过大的负载,内存分配策略无法安全地只依赖JRE对程序的行为的各种假设,需要使用JRE提供的选项调整垃圾回收策略应对。 写入磁盘的数据客户端不连续,导致Java虚拟机堆内存出现空洞。 年轻代空间:128~512M之间 老生代:好几G。 配置文件添加: hbase-env.sh: HBASEOPTS或者HBASEREGIONSERVER_OPT(推荐) 推荐配置: exportHBASE_REGIONOBSERVER_OPTS=" -Xmx8g \ -Xms8g \ -Xmn128m\ -XX:+UseParNewGC\ -XX:+UseConcMarkSweepGC \ -XX:CMSInitiatingOccupancyFraction=70 \ -verbose:gc \ -XX:+PrintGCDetails\ -XX:+PrintGCTimeStamps \ -Xloggc:$HBASE_HOME/logs/gc-${HOSTNAME}-hbase.log" 参照: http://blog.csdn.net/kthq/article/details/8618052 http://swcdxd.iteye.com/blog/1859858 二:hbase压缩 可用编码器:GZIP/LZO/Snappy Snappy性能稍好,多使用Snappy hbase启动检查压缩: hbase.regionserver.codecs snappy,lzo 启用压缩: hbase> create 'test2', { NAME => 'cf2', COMPRESSION => 'SNAPPY' } hbase> describe 'test' DESCRIPTION ENABLED 'test', {NAME => 'cf', DATA_BLOCK_ENCODING => 'NONE false ', BLOOMFILTER => 'ROW', REPLICATION_SCOPE => '0', VERSIONS => '1', COMPRESSION => 'GZ', MIN_VERSIONS => '0', TTL => 'FOREVER', KEEP_DELETED_CELLS => 'fa lse', BLOCKSIZE => '65536', IN_MEMORY => 'false', BLOCKCACHE => 'true'} 1 row(s) in 0.1070 seconds 或者:hbase> disable 'test' hbase> alter 'test', {NAME => 'cf', COMPRESSION => 'GZ'} hbase> enable 'test' 三:优化拆分与合并 3.1管理拆分 hbase可能出现‘拆分/合并风暴’ 关闭自动管理拆分,启用手动 To disable automatic splitting, set hbase.hregion.max.filesize to a very large value, such as 100 GB It is not recommended to set it to its absolute maximum value of Long.MAX_VALUE. 3.2 region热点问题 /rowkey的设计一:salting前缀设计/ byte prefix = (byte) (Long.hashCode(System.currentTimeMillis()) % 8); byte[] rowkey1 = Bytes.add(Bytes.toBytes(prefix), Bytes.toBytes(System.currentTimeMillis())); /rowkey的设计二:字段交换,提升权重/ value + System.currentTimeMillis(); /rowkey的设计三:随机化/ MessageDigest md = MessageDigest.getInstance("MD5"); byte[] rowkey3 = md.digest(Bytes.toBytes(System.currentTimeMillis())); /rowkey的设计四:时间顺序/ long rowkey4 = Long.MAX_VALUE - System.currentTimeMillis(); 还可以使用API中move()region移动到另一个regionserver;或者UNassign移除受影响的表的region 3.3预拆分region 创建表指定需要的region数目 hbase>create 't1','f',SPLITS => ['10','20',30'] hbase>create 't14','f',SPLITS_FILE=>'splits.txt' # create table with four regions based on random bytes keys hbase>create 't2','f1', { NUMREGIONS => 4 , SPLITALGO => 'UniformSplit' } # create table with five regions based on hex keys hbase>create 't3','f1', { NUMREGIONS => 5, SPLITALGO => 'HexStringSplit' } 参考:http://hbase.apache.org/book.html#compression 四:负载均衡: Use the shell to disable the balancer: hbase(main):001:0> balance_switch false true 0 row(s) in 0.3590 seconds This turns the balancer OFF. To reenable, do: hbase(main):001:0> balance_switch true false 0 row(s) in 0.3590 seconds 五:合并region: 某些特出情况下,用户需要合并region(删除了大量数据) $ bin/hbase org.apache.hadoop.hbase.util.Merge (If you feel you have too many regions and want to consolidate them, Merge is the utility you need. Merge must run be done when the cluster is down) 六:客户端api优化: 6.1禁止自动刷写 有大量的写入操作 When performing a lot of Puts, make sure that setAutoFlush is set to false on your Table instance. Otherwise, the Puts will be sent one at a time to the RegionServer. Puts added via table.add(Put) and table.add( Put) wind up in the same write buffer. If autoFlush = false, these messages are not sent until the write-buffer is filled. To explicitly flush the messages, call flushCommits. Calling close on the Table instance will invoke flushCommits. 6.2使用扫描缓存 比如:hbase作为mapreduce输入源。 设置setCaching比默认值大多的值。 If HBase is used as an input source for a MapReduce job, for example, make sure that the input Scan instance to the MapReduce job has setCaching set to something greater than the default (which is 1). Using the default value means that the map-task will make call back to the region-server for every record processed. Setting this value to 500, for example, will transfer 500 rows at a time to the client to be processed 6.3限定扫描范围 6.4关闭resultScanner 七:配置优化; 7.1减少zookeeper超时 zookeeper.session.timeout 默认三分钟 7.2增加regionserver处理线程 hbase.regionserver.handler.count 默认10 7.3增加region大小 管理较少的region可以集群运行更平稳 默认256M 7.4减少最大日志文件数目 对于写压力比较大的应用,降低值强迫服务器频繁将数据写到磁盘,刷写到磁盘的数据的日志就可以丢弃了。 7.5启用数据压缩

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

人脸识别实践

前言 很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的我自己。其实如果如果你不是非要深究其中的原理,只是要实现这一工作的话,人脸识别也没那么难。今天我们就来看看如何在40行代码以内简单地实现人脸识别。 一点区分 对于大部分人来说,区分人脸检测和人脸识别完全不是问题。但是网上有很多教程有意无意地把人脸检测说成是人脸识别,误导群众,造成一些人认为二者是相同的。其实,人脸检测解决的问题是确定一张图上有木有人脸,而人脸识别解决的问题是这个脸是谁的。可以说人脸检测是是人识别的前期工作。 今天我们要做的是人脸识别。 所用工具 Anaconda 2 —— Python 2 Dlib scikit-image Dlib 对于今天要用到的主要工具,还是有必要多说几句的。Dlib是基于现代C++的一个跨平台通用的框架,作者非常勤奋,一直在保持更新。Dlib内容涵盖机器学习、图像处理、数值算法、数据压缩等等,涉猎甚广。更重要的是,Dlib的文档非常完善,例子非常丰富。就像很多库一样,Dlib也提供了Python的接口,安装非常简单,用pip只需要一句即可: pip install dlib 上面需要用到的scikit-image同样只是需要这么一句: pip install scikit-image 注:如果用pip install dlib安装失败的话,那安装起来就比较麻烦了。错误提示很详细,按照错误提示一步步走就行了。 人脸识别 之所以用 Dlib 来实现人脸识别,是因为它已经替我们做好了绝大部分的工作,我们只需要去调用就行了。Dlib里面有人脸检测器,有训练好的人脸关键点检测器,也有训练好的人脸识别模型。今天我们主要目的是实现,而不是深究原理。感兴趣的同学可以到官网查看源码以及实现的参考文献。 今天的例子既然代码不超过40行,其实是没啥难度的。有难度的东西都在源码和论文里。 首先先通过文件树看一下今天需要用到的东西: 准备了六个候选人的图片放在candidate-faces文件夹中,然后需要识别的人脸图片test.jpg。我们的工作就是要检测到test.jpg中的人脸,然后判断她到底是候选人中的谁。 另外的girl-face-rec.py是我们的python脚本。shape_predictor_68_face_landmarks.dat是已经训练好的人脸关键点检测器。dlib_face_recognition_resnet_model_v1.dat是训练好的ResNet人脸识别模型。ResNet是何凯明在微软的时候提出的深度残差网络,获得了 ImageNet 2015 冠军,通过让网络对残差进行学习,在深度和精度上做到了比 CNN 更加强大。 1. 前期准备 shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat都可以在这里找到。不能点击超链接的可以直接输入以下网址:http://dlib.net/files/。 然后准备几个人的人脸图片作为候选人脸,最好是正脸。放到candidate-faces文件夹中。 本文这里准备的是六张图片,如下: 她们分别是 然后准备四张需要识别的人脸图像,其实一张就够了,这里只是要看看不同的情况: 可以看到前两张和候选文件中的本人看起来还是差别不小的,第三张是候选人中的原图,第四张图片微微侧脸,而且右侧有阴影。 2.识别流程 数据准备完毕,接下来就是代码了。识别的大致流程是这样的: 先对候选人进行人脸检测、关键点提取、描述子生成后,把候选人描述子保存起来。 然后对测试人脸进行人脸检测、关键点提取、描述子生成。 最后求测试图像人脸描述子和候选人脸描述子之间的欧氏距离,距离最小者判定为同一个人。 3.代码 代码不做过多解释,因为已经注释的非常完善了。以下是girl-face-rec.py # -*- coding: UTF-8 -*- import sys,os,dlib,glob,numpy from skimage import io if len(sys.argv) != 5: print "请检查参数是否正确" exit() # 1.人脸关键点检测器 predictor_path = sys.argv[1] # 2.人脸识别模型 face_rec_model_path = sys.argv[2] # 3.候选人脸文件夹 faces_folder_path = sys.argv[3] # 4.需识别的人脸 img_path = sys.argv[4] # 1.加载正脸检测器 detector = dlib.get_frontal_face_detector() # 2.加载人脸关键点检测器 sp = dlib.shape_predictor(predictor_path) # 3. 加载人脸识别模型 facerec = dlib.face_recognition_model_v1(face_rec_model_path) # win = dlib.image_window() # 候选人脸描述子list descriptors = [] # 对文件夹下的每一个人脸进行: # 1.人脸检测 # 2.关键点检测 # 3.描述子提取 for f in glob.glob(os.path.join(faces_folder_path, "*.jpg")): print("Processing file: {}".format(f)) img = io.imread(f) #win.clear_overlay() #win.set_image(img) # 1.人脸检测 dets = detector(img, 1) print("Number of faces detected: {}".format(len(dets))) for k, d in enumerate(dets): # 2.关键点检测 shape = sp(img, d) # 画出人脸区域和和关键点 # win.clear_overlay() # win.add_overlay(d) # win.add_overlay(shape) # 3.描述子提取,128D向量 face_descriptor = facerec.compute_face_descriptor(img, shape) # 转换为numpy array v = numpy.array(face_descriptor) descriptors.append(v) # 对需识别人脸进行同样处理 # 提取描述子,不再注释 img = io.imread(img_path) dets = detector(img, 1) dist = [] for k, d in enumerate(dets): shape = sp(img, d) face_descriptor = facerec.compute_face_descriptor(img, shape) d_test = numpy.array(face_descriptor) # 计算欧式距离 for i in descriptors: dist_ = numpy.linalg.norm(i-d_test) dist.append(dist_) # 候选人名单 candidate = ['Unknown1','Unknown2','Shishi','Unknown4','Bingbing','Feifei'] # 候选人和距离组成一个dict c_d = dict(zip(candidate,dist)) cd_sorted = sorted(c_d.iteritems(), key=lambda d:d[1]) print "\n The person is: ",cd_sorted[0][0] dlib.hit_enter_to_continue() 4.运行结果 我们在.py所在的文件夹下打开命令行,运行如下命令 python girl-face-rec.py 1.dat 2.dat ./candidate-faecs test1.jpg 由于shape_predictor_68_face_landmarks.dat和dlib_face_recognition_resnet_model_v1.dat名字实在太长,所以我把它们重命名为1.dat和2.dat。 运行结果如下: The person is Bingbing。 记忆力不好的同学可以翻上去看看test1.jpg是谁的图片。有兴趣的话可以把四张测试图片都运行下试试。 这里需要说明的是,前三张图输出结果都是非常理想的。但是第四张测试图片的输出结果是候选人4。对比一下两张图片可以很容易发现混淆的原因。 机器毕竟不是人,机器的智能还需要人来提升。 有兴趣的同学可以继续深入研究如何提升识别的准确率。比如每个人的候选图片用多张,然后对比和每个人距离的平均值之类的。全凭自己了。

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

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

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册