1.大数据分析流程1.数据采集2.数据预处理3.数据入库(HIVE数据仓库)4.数据分析(ETL分析语句)5.数据展现2.需要使用到的java技术1.hadoopHadoop是一个开源框架，允许使用简单的编程模型在跨计算机集群的分布式环境中存储和处理大数据。它的设计是从单个服务器扩展到数千个机器，每个都提供本地计算和存储。MapReduce算法和Hadoop分布式文件系统2.flume 日志收集系统Flume是Cloudera提供的一个高可用的，高可靠的，分布式的海量日志采集、聚合和传输的系统，Flume支持在日志系统中定制各类数据发送方，用于收集数据；同时，Flume提供对数据进行简单处理，并写到各种数据接受方（可定制）的能力。3.hive 数据仓库hive是基于Hadoop的一个数据仓库工具，用来进行数据提取、转化、加载，这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表，并提供SQL查询功能，能将SQL语句转变成MapReduce任务来执行。Hive的优点是学习成本低，可以通过类似SQL语句实现快速MapReduce统计，使MapReduce变得更加简单，而不必开发专门的MapReduce应用程序。hive十分适合对数据仓库进行统计分析。4.hbase 非结构数据库HBase是一个分布式的、面向列的开源数据库，该技术来源于 Fay Chang 所撰写的Google论文“Bigtable：一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统（File System）所提供的分布式数据存储一样，HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库，它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。5.Kibana 日志分析平台6.sqoop 数据转换Sqoop(发音：skup)是一款开源的工具，主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql...)间进行数据的传递，可以将一个关系型数据库（例如 ： MySQL ,Oracle ,Postgres等）中的数据导进到Hadoop的HDFS中，也可以将HDFS的数据导进到关系型数据库中。7.storm 数据实时计算Storm是Twitter开源的分布式实时大数据处理框架，被业界称为实时版Hadoop。随着越来越多的场景对Hadoop的MapReduce高延迟无法容忍，比如网站统计、推荐系统、预警系统、金融系统(高频交易、股票)等等，大数据实时处理解决方案（流计算）的应用日趋广泛，目前已是分布式技术领域最新爆发点，而Storm更是流计算技术中的佼佼者和主流。Storm对于实时计算的意义类似于Hadoop对于批处理的意义。Hadoop提供了map、reduce原语，使我们的批处理程序变得简单和高效。同样，Storm也为实时计算提供了一些简单高效的原语，而且Storm的Trident是基于Storm原语更高级的抽象框架，类似于基于Hadoop的Pig框架，让开发更加便利和高效。 8.spark 数据准实时计算 -> scala语言Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架，Spark，拥有Hadoop MapReduce所具有的优点；但不同于MapReduce的是——Job中间输出结果可以保存在内存中，从而不再需要读写HDFS，因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。Spark 是一种与 Hadoop 相似的开源集群计算环境，但是两者之间还存在一些不同之处，这些有用的不同之处使 Spark 在某些工作负载方面表现得更加优越，换句话说，Spark 启用了内存分布数据集，除了能够提供交互式查询外，它还可以优化迭代工作负载。Spark 是在 Scala 语言中实现的，它将 Scala 用作其应用程序框架。与 Hadoop 不同，Spark 和 Scala 能够紧密集成，其中的 Scala 可以像操作本地集合对象一样轻松地操作分布式数据集。9.kafaka 消息队列Kafka是由Apache软件基金会开发的一个开源流处理平台，由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统，它可以处理消费者在网站中的所有动作流数据。 这种动作（网页浏览，搜索和其他用户的行动）是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统，但又要求实时处理的限制，这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理，也是为了通过集群来提供实时的消息。
shutdown.sh#!/bin/bash echo "Stopping sys-pay" pid=`ps -ef|grep majiameng-0.0.1-SNAPSHOT.jar|grep -v grep|awk '{print $2}'` if [ -n "$pid" ] then echo "kill -9 的pid:" $pid kill -9 $pid fistart.sh#!/bin/bash cp /root/.jenkins/workspace/test/target/majiameng-0.0.1-SNAPSHOT.jar /home1/wwwroot/test BUILD_ID=dontKillMe nohup java -jar majiameng-0.0.1-SNAPSHOT.jar >/home1/logs/test.log 2>&1 &
第一部分：选择题 1、下列有关 Excel 工作表命名的说法中,正确的是( C) A、工作表的名字只能以字母开头 B、同一个工作簿可以存在两个同名的工作表 C、工作表的命名应该“见名知义” D、工作簿默认的工作表名称为 Book1 2、下列有关 Excel 工作表单元格的说法中,错误的是( B) A、每个单元格都有固定的地址 B、同列不同单元格的宽度可以不同 C、若干单元格构成工作表 D、同列不同单元格可以选择不同的数字分类 3、下列关于 Excel 公式或函数的说法中,错误的是（D ） A、公式中的乘、除号分别用*、/表示 B、公式复制后,被引用的地址有可能变化 C、公式必须以“=”号开头 D、函数“MAX(A1:C3)”引用了 4 个单元格 4、用鼠标拖放操作复制单元格数据时必须同时按住( C) A、 B、 C、 D、 5、在 Exce1 工作表中,每个单元格都有唯一的编号叫地址,地址的使用方法是(B ) A、字母+数字 B、列标+行号 C、数字+字母 D、行号+列标 6、在 Exce1 操作中,假设 A1,B1,C1,D1 单元分别为 2,3,7,3,则 SUM(A1:C1)/D1 的值 为 （D ） A、15 B、18 C、3 D、4 7、Exce1 中有多个常用的简单函数,其中函数 AVERAGE(区域)的功能是（ B） A、求区域内数据的个数 B、求区城内所有数字的平均值 C、求区城内数字的和 D、返回函数的最大值 8、如果用预置小数的方法输入数据时,当设定小数位数是“2”时,输入 12345 表示 （D ） A、1234500 B、123.45 C、12345 D、12345.00 9、在 EXCEL 中,可使用（ B）中的命令,给选定的单元格加边框 A、视图菜单 B、格式菜单 C、工具菜单 D、窗口菜单 10、在 EXCEL 中,如果我们只需要数据列表中记录的一部分时,可以使用 EXCEL 提 供的（B ）功能 A、排序 B、自动筛选 C、分类汇总 D、以上全部 11、在关系型数据库中储蓄所有多个储户，储户在多个储蓄所存取款，储蓄所与 储户之间是 (D ) A、一对一的联系 B、一对多的联系 C、多对一的联系 D、多对多的联系 12、使用 SQL 语句进行分组检索时，为了去掉不满足条件的分组，应当 （B ） A、使用 WHERE 子句 B、在 GROUP BY 后面使用 HAVING 子句 C、先使用 WHERE 子句，再使用 HAVING 子句 D、先使用 HAVING 子句，再使用 WHERE 子句 13、在 SQL 语句中，与表达式"仓库号 NOT IN（"wh1","wh2"） 功能相同的表 达式是（D ） A、仓库号="wh1" AND 仓库号="wh2"B、仓库号!="wh1" OR 仓库号！= "wh2" C、仓库号="wh1" OR 仓库号="wh2" D、仓库号!="wh1" AND 仓库号!="wh2" 14、设有图书管理数据库： 图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2)) 读者(借书证号 C(4),单位 C(8),姓名 C(6),性别 C(2),职称 C(6),地址 C(20)) 借阅(借书证号 C(4),总编号 C(6),借书日期 D(8)) 对于图书管理数据库，分别求出各个单位当前借阅图书的读者人次。下面的 SQL 语句正确的是 （A ） SELECT 单位,______ FROM 借阅,读者 WHERE;借阅.借书证号=读者.借书证号 __ A、COUNT(借阅.借书证号) ，GROUP BY 单位 B、SUM(借阅.借书证号) ，GROUP BY 单位 C、COUNT(借阅.借书证号)， ORDER BY 单位 D、COUNT(借阅.借书证号) ，HAVING 单位 15、在 EXCEL 中,公式输入完后应按（A ）A、ENTER B、CTRL+ENTER C、SHIFT+ENTER D、CTRL+SHIFT+ENTER 16、EXCEL 的主要功能有（B ） A、电子表格、文字处理、数据库 B、电子表格、图表、数据库 C、工作表、工作簿、图表 D、电子表格、工作簿、数据库 17、在 EXCEL 工作表中,当插入行或列时,后面的行或列将向(A )方向自动移动 A、向下或向右 B、向下或向左 C、向上或向右 D、向上或向左 18、在 EXCEL 中，创建公式的操作步骤有：①在编辑栏键入“=”；②键入公式； ③按 ENTER 键；④选择需要建立公式的单元格；其正确的顺序是（C ） A、①②③④ B、④①③② C、④①②③ D、④③①② 19、在 EXCEL 中,当数据超过单元格的列宽，在单元格中显示的一组符号是（B ） A、？ B、# C、% D、* 20、以下选项中描述正确的是 （D ） A: 数据库设计是指设计数据库管理系统 B: 数据库系统中，数据的物理结构必须与逻辑结构一致 C: 数据库是一个独立的系统，不需要操作系统的支持 D: 数据库技术的根本目标是要解决数据共享的问题 21、EXCEL 中的数据类型有(D ) A、数值型 B、字符型 C、逻辑型 D、以上全部 22、在 excel 中,选定一个单元格后按 DEL 键,将被删除的是(B ) A、单元格 B、单元格中的内容 C、单元格中的内容及格式等 D、单元格所在的行 23、SQL 语言的数据操纵语句包括 SELECT、INSERT、UPDATE、DELETE 等。其 中最重要的，也是使用最频繁的语句是(B )。 A．UPDATE B．SELECT C．DELETE D．INSERT 24、在 Excel 工作表的第 3 行第 4 列的单元格地址是(A ) A、D3 B、D4 C、3D D、4D 25、excel 的每一个工作表最多可包含(C )列 A、255 B、254 C、256 C、没有限定 26、excel 的每一个工作表最多可包含(B )行 A、65535 B、65536 C、60000 D、65555 27、单元格中（ C） A、只能包含数字 B、只能包含文字 C、可以是数字、字符、公式等 D、以上都不是 28、如果要将一单元格中的公式计算结果数值复制到另一单元格中,应选择菜单 (B ) A、文件 B、编辑 C、格式 D、工具 29、数据独立性是数据库技术的重要特点之一，关于数据独立性，以下选项中描 述正确的是 （D ） A: 数据与程序独立存放 B: 不同数据只能被对应的应用程序所使用 C: 不同数据被存放在不同的文件中 D: 以上三种说法都不对 30、在同一个工作簿中要引用其他工作表某个单元格的数据(如 sheet8 单元格中 的数据),下面的表达方式中正确的是( A) A、= sheet8!D8 B、=D8( sheet8) C、+ sheet8!D8 D、$ sheet8>$D8 31、在 SQL 语言中，子查询是（D ）。 A．选取单表中字段子集的查询语句 B．选取多表中字段子集的查询语句 C．返回单表中数据子集的查询语言 D．嵌入到另一个查询语句之中的查询语句 32、下面哪个函数可以返回逻辑值 TRUE ( B) A、AND(TRUE, TRUE, FALSE) B、OR(TRUE, TRUE, FALSE) C、OR(FALSE, FALSE. FALSE) D、NOT(TRUE) 33、若单元格 B2、C2、D2 的内容分别为 2800、89、88,单元格 E2 中有函数 “ =IF(AND(B2>2000,OR(C2>90,D2>90),” 五 星”,IF(AND(B2>1800,OR(C2>85,D2>85)),”四星”,”三星”))”则最终单元格 E2 中显示 的内容为 (C ) A、出错 B、三星 C、四星 D、五星 34、若在单元格中输入函数 MOD(7,-2)，则单元格会显示（A ） A、-1 B、1 B、-3 D、3 35、函数 find(“t”,”yesterday after tomarrow”,5)返回（B ） A、4 B、13 C、17 D、20 36、在视图上不能完成的操作是(B ) A．查询 B．在视图上定义新的视图 C．更新视图 D．在视图上定义新的表 37、下列不能从“yesterday“中取出字符串”yes“的函数是（C ） A、MID(“yesterday”,1,3) B、LEFT(“yesterday”,3) C、MIDB(“yesterday”,1,6) D、RIGHT(MID(“yesterday”,1,3),3) 38、函数 COLUMNE(B1:E5)返回（ C） A、1 B、2 C、4 D、5 39、在下列哪种情况下需要引用绝对地址 ( D) A、当把一个含有单元格地址的公式拷贝到一个新的位置时,为使公式中单元格地 址随新位置而变化 B、当在引用的函数中填入一个范围时,为使函数中的范围随地址位置不同而变化 C、当把一个含有范围的公式或函数拷贝到一个新的位置时,为使公式或函数中范 围随新位置不同而变化 D、当把一个含有范围的公式或函数拷贝到一个新的位置时,为使公式或函数中范 围不随新位置不同而变化 40、以下选项中说法错误的是 （C ） A: DML 是数据操纵语言 B: DCL 是数据控制语言 C: DBMS 是数据库系统 D: DDL 是数据定义语言 41、cloudera 提供哪几种安装 CDH 方法（ D ）。 · 1）Cloudera manager · 2）Tarball · 3）Yum · 4）Rpm A．1，2 B.1，2，3 C. 1,2,4 D. 1,2,3,4 42、下面哪个端口不是 spark 自带服务的端口 (C ) A.8080 B.4040 C.8090 D.18080 43、Spark Job 默认的调度模式 (A ) A FIFO B FAIR C 无 D 运行时指定 44、哪个不是本地模式运行的个条件 ( D ) A spark.localExecution.enabled=true B 显式指定本地运行 C finalStage 无父 Stage D partition 默认值 45、下面哪个不是 RDD 的特点 ( C ) A.可分区 B 可序列化 C 可修改 D 可持久化 46、关于广播变量，下面哪个是错误的 ( D ) A 任何函数调用 B 是只读的 C 存储在各个节点 D 存储在磁盘或 HDFS 47、关于累加器，下面哪个是错误的 (D ) A 支持加法 B 支持数值类型 C 可并行 D 不支持自定义类型 48、Spark 支持的分布式部署方式中哪个是错误的 (D ) A standalone B spark on mesos C spark on YARN D Spark on local 49、Stage 的 Task 的数量由什么决定 (A ) A Partition B Job C Stage D TaskScheduler 50、下面哪个操作肯定是宽依赖 ( C ) A map B flatMap C reduceByKey D sample 51、下列哪项不可以作为集群的管理？（ D ） A、Puppet B、PdshC、Cloudera Manager D、Zookeeper 52、Spark Streaming 和 Storm 有何区别？？ （ B ） A．一个实时毫秒一个准实时亚秒，不过 Spark Streaming 的吞吐率比较低 B．一个实时毫秒一个准实时亚秒，不过 storm 的吞吐率比较低 C．一个准实时亚秒一个实时毫秒，不过 storm 的吞吐率比较低 D．一个准实时亚秒一个实时毫秒，不过 park Streaming 的吞吐率比较低 53、ETL 过程中四个基本的过程分别是什么？ （ A ） A、抽取（extract）、清洗（clean）、一致性处理（comform）和交付（delivery）， 简称为 ECCD B、抽取（extract）、清洗（clean）、交付（delivery）和一致性处理（comform）， 简称为 ECDC C、抽取（extract）、一致性处理（comform）、清洗（clean）、和交付（delivery）， 简称为 ECCD 54、读取源系统的数据模型，连接并访问源系统的数据，变化数据捕获，抽取 数据到数据准备区。以上四项功能是属于 ETL 哪个阶段的任务？（ C ） A、一致性 B、清洗 C、抽取 D、交付 55、将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务？ ( C ) A、频繁模式挖掘 B、分类和预测 C、数据预处理D、数据流挖掘 第二部分：问答题（4 题，共 20 分） 问题一、什么是 Tableau？如何从 Tableau 中的提取？ 参考答案： Tableau 是一种商业智能软件，允许任何人连接到相应的数据，然后可视化并创 建交互式的可共享仪表板。 可用于提高性能和离线分析的数据源的已保存子集。 问题二、叙述 tableau 的优势 参考答案： 1）、什么都能连：都能连，不能直连的也可通过 odbc 来连 2）、学习门槛低：官方有最新版本的视频、文本、案例提供。 3）、轻量级：简单拖拉拽就能快速创建一个报表 4）、更智能，比如自动识别维度和度量、自动求和、自动识别关联条件 5）、给人亲切感：能找到 excel、PPT 及其他数据分析工具的身影，功能类似 6）、丰富的图表展示 问题三、存储过程有什么优点？ 参考答案： 存储过程或者函数可以重复使用，可以减少数据库开发人员，尤其是应用程序开 发人员的工作量。 使用存储过程或者函数可以增强数据的安全访问控制。可以设定只有某些数据库 用户才具有某些存储过程或者函数的执行权。 问题四、请简述 cloudera manager 有哪四大功能：？ 参考答案： （1）管理：对集群进行管理，如添加、删除节点等操作。 （2）监控：监控集群的健康情况，对设置的各种指标和系统运行情况进行全面 监控。 （3）诊断：对集群出现的问题进行诊断，对出现的问题给出建议解决方案。 （4）集成：对 hadoop 的多组件进行整合。 问题五、实时数据统计会用到哪些技术，他们各自的应用场景及区别是什么? 参考答案： flume：日志收集系统，主要用于系统日志的收集 kafka：消息队列，进行消息的缓存和系统的解耦 storm：实时计算框架，进行流式的计算。 参考答案： 1-5 CBDCB 6-10 DBDBB 11-15 DBDAA 16-20 BACBD 21-25 DBBAC 26-30 BCBDA 31-35 DBCAB 36-40 BCCDC 41-45 DCADC 46-50DDDAC 51-55DBACC
Thymeleaf3语法详解Thymeleaf是Spring boot推荐使用的模版引擎，除此之外常见的还有Freemarker和Jsp。Jsp应该是我们最早接触的模版引擎。而Freemarker工作中也很常见（Freemarker教程）。今天我们从三个方面学习Thymeleaf的语法：有常见的TH属性，四种标准表达式用法，在SpringBoot中的应用。还在等什么，一起来学吧！技术：Thymeleaf，SpringBoot文章目录结构：一、th属性常用th属性解读html有的属性，Thymeleaf基本都有，而常用的属性大概有七八个。其中th属性执行的优先级从1~8，数字越低优先级越高。一、th:text ：设置当前元素的文本内容，相同功能的还有th:utext，两者的区别在于前者不会转义html标签，后者会。优先级不高：order=7二、th:value：设置当前元素的value值，类似修改指定属性的还有th:src，th:href。优先级不高：order=6三、th:each：遍历循环元素，和th:text或th:value一起使用。注意该属性修饰的标签位置，详细往后看。优先级很高：order=2四、th:if：条件判断，类似的还有th:unless，th:switch，th:case。优先级较高：order=3五、th:insert：代码块引入，类似的还有th:replace，th:include，三者的区别较大，若使用不恰当会破坏html结构，常用于公共代码块提取的场景。优先级最高：order=1六、th:fragment：定义代码块，方便被th:insert引用。优先级最低：order=8七、th:object：声明变量，一般和*{}一起配合使用，达到偷懒的效果。优先级一般：order=4八、th:attr：修改任意属性，实际开发中用的较少，因为有丰富的其他th属性帮忙，类似的还有th:attrappend，th:attrprepend。优先级一般：order=5常用th属性使用使用Thymeleaf属性需要注意点以下五点：一、若要使用Thymeleaf语法，首先要声明名称空间： xmlns:th="//www.thymeleaf.org"二、设置文本内容 th:text，设置input的值 th:value，循环输出 th:each，条件判断 th:if，插入代码块 th:insert，定义代码块 th:fragment，声明变量 th:object三、th:each 的用法需要格外注意，打个比方：如果你要循环一个div中的p标签，则th:each属性必须放在p标签上。若你将th:each属性放在div上，则循环的是将整个div。四、变量表达式中提供了很多的内置方法，该内置方法是用#开头，请不要与#{}消息表达式弄混。五、th:insert，th:replace，th:include 三种插入代码块的效果相似，但区别很大。 Thymeleaf 语法 ITDragon Thymeleaf 语法 ID: TH: DE: 后台给负责给变量赋值，和跳转页面。import com.itdragon.entities.ThObject; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Controller public class ThymeleafController { @RequestMapping("thymeleaf") public String thymeleaf(ModelMap map) { map.put("thText", "th:text 设置文本内容 加粗"); map.put("thUText", "th:utext 设置文本内容 加粗"); map.put("thValue", "thValue 设置当前元素的value值"); map.put("thEach", Arrays.asList("th:each", "遍历列表")); map.put("thIf", "msg is not null"); map.put("thObject", new ThObject(1L, "th:object", "用来偷懒的th属性")); return "grammar/thymeleaf"; } }二、标准表达式语法${...} 变量表达式，Variable Expressions @{...} 链接表达式，Link URL Expressions #{...} 消息表达式，Message Expressions ~{...} 代码块表达式，Fragment Expressions *{...} 选择变量表达式，Selection Variable Expressions变量表达式使用频率最高，其功能也是非常的丰富。所以我们先从简单的代码块表达式开始，然后是消息表达式，再是链接表达式，最后是变量表达式，随带介绍选择变量表达式。~{...} 代码块表达式支持两种语法结构推荐：~{templatename::fragmentname}支持：~{templatename::#id}templatename：模版名，Thymeleaf会根据模版名解析完整路径：/resources/templates/templatename.html，要注意文件的路径。fragmentname：片段名，Thymeleaf通过th:fragment声明定义代码块，即：th:fragment="fragmentname"id：HTML的id选择器，使用时要在前面加上#号，不支持class选择器。代码块表达式的使用代码块表达式需要配合th属性（th:insert，th:replace，th:include）一起使用。th:insert：将代码块片段整个插入到使用了th:insert的HTML标签中，th:replace：将代码块片段整个替换使用了th:replace的HTML标签中，th:include：将代码块片段包含的内容插入到使用了th:include的HTML标签中，用一个官方例子来区分三者的不同，第三部分会通过实战再次用到该知识。 © 2011 The Good Thymes Virtual Grocery © 2011 The Good Thymes Virtual Grocery © 2011 The Good Thymes Virtual Grocery © 2011 The Good Thymes Virtual Grocery {...} 消息表达式消息表达式一般用于国际化的场景。结构：th:text="#{msg}" 。会在第三部分的实战详细介绍。@{...} 链接表达式链接表达式好处不管是静态资源的引用，form表单的请求，凡是链接都可以用@{...} 。这样可以动态获取项目路径，即便项目名变了，依然可以正常访问修改项目名，链接表达式会自动修改路径，避免资源文件找不到server.context-path=/itdragon链接表达式结构无参：@{/xxx}有参：@{/xxx(k1=v1,k2=v2)} 对应url结构：xxx?k1=v1&k2=v2引入本地资源：@{/项目本地的资源路径}引入外部资源：@{/webjars/资源在jar包中的路径}列举：第三部分的实战引用会详细使用该表达式 中文 English${...}变量表达式变量表达式有丰富的内置方法，使其更强大，更方便。变量表达式功能一、可以获取对象的属性和方法二、可以使用ctx，vars，locale，request，response，session，servletContext内置对象三、可以使用dates，numbers，strings，objects，arrays，lists，sets，maps等内置方法（重点介绍）常用的内置对象一、ctx ：上下文对象。二、vars ：上下文变量。三、locale：上下文的语言环境。四、request：（仅在web上下文）的 HttpServletRequest 对象。五、response：（仅在web上下文）的 HttpServletResponse 对象。六、session：（仅在web上下文）的 HttpSession 对象。七、servletContext：（仅在web上下文）的 ServletContext 对象这里以常用的Session举例，用户刊登成功后，会把用户信息放在Session中，Thymeleaf通过内置对象将值从session中获取。// java 代码将用户名放在session中 session.setAttribute("userinfo",username); // Thymeleaf通过内置对象直接获取 th:text="${session.userinfo}"常用的内置方法一、strings：字符串格式化方法，常用的Java方法它都有。比如：equals，equalsIgnoreCase，length，trim，toUpperCase，toLowerCase，indexOf，substring，replace，startsWith，endsWith，contains，containsIgnoreCase等二、numbers：数值格式化方法，常用的方法有：formatDecimal等三、bools：布尔方法，常用的方法有：isTrue，isFalse等四、arrays：数组方法，常用的方法有：toArray，length，isEmpty，contains，containsAll等五、lists，sets：集合方法，常用的方法有：toList，size，isEmpty，contains，containsAll，sort等六、maps：对象方法，常用的方法有：size，isEmpty，containsKey，containsValue等七、dates：日期方法，常用的方法有：format，year，month，hour，createNow等文章底部提供了对应的官网链接 ITDragon Thymeleaf 内置方法 ITDragon Thymeleaf 内置方法 #strings Old Str : toUpperCase : toLowerCase : equals : equalsIgnoreCase : indexOf : substring : replace : startsWith : contains : #numbers formatDecimal 整数部分随意，小数点后保留两位，四舍五入: formatDecimal 整数部分保留五位数，小数点后保留两位，四舍五入: #bools #arrays length : contains : containsAll : #lists size : contains : sort : #maps size : containsKey : containsValue : #dates format : custom format : day : month : monthName : year : dayOfWeekName : hour : minute : second : createNow : 后台给负责给变量赋值，和跳转页面。@RequestMapping("varexpressions") public String varexpressions(ModelMap map) { map.put("itdragonStr", "itdragonBlog"); map.put("itdragonBool", true); map.put("itdragonArray", new Integer[]{1,2,3,4}); map.put("itdragonList", Arrays.asList(1,3,2,4,0)); Map itdragonMap = new HashMap(); itdragonMap.put("thName", "${#...}"); itdragonMap.put("desc", "变量表达式内置方法"); map.put("itdragonMap", itdragonMap); map.put("itdragonDate", new Date()); map.put("itdragonNum", 888.888D); return "grammar/varexpressions"; }三、Thymeleaf在SpringBoot应用Thymeleaf是Spring Boot 官方推荐使用的模版引擎，这也意味着用Thymeleaf比其他模版引擎更简单。开发步骤：第一步：引入Thymeleaf依赖。第二步： 提取公共页面，提高代码的重用性，统一页面风格。第三步：页面显示和国际化功能引入Thymeleafpom.xml 引入Thymeleaf的依赖，并确定其版本<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version> <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> </dependencies>提取公共页面为了统一页面风格，提高页面的复用率，我们一般都会提取公共页面。之前在文章中介绍了SiteMesh的使用，今天用Thymeleaf来实现。统一规范引入的资源文件 ITDragon系统 统一左侧菜单栏 Toggle navigation ITDragon sb-admin-1.0.4 Dashboard Employees 以上代码用到了三个知识点：一、使用链接表达式引入本地的资源文件，若引入第三方外部资源文件，可以通过webjars（将资源文件打成jar包放在项目中）方式引入。二、使用th:fragment标识需要被引用的代码块，也可以用id选择器但不推荐。三、activeUrl变量是通过代码块表达式在其他页面传入的变量，这也是代码块表达式强大的一个功能。页面显示和国际化Spring Boot 实现国际化步骤：第一步：准备好国际化文件，至少三分（系统默认，中文，英文）第二步：在Spring Boot全局配置文件中，指定国际化文件路径，第三步：自定义Locale Resolver第四步：在页面上使用消息表达式输出国际化内容这里只贴出第四步的代码，前三步以及完整代码请异步github 员工列表 × [[${emp.lastName}]] 以上代码用到了知识点：一、页面通过代码块表达式引入公共代码块，并传入参数给公共代码块文件。二、页面使用消息表达式输出国际化内容。三、使用th:if属性条件判断，使用内置方法#strings.isEmpty 判断参数是否为空，使用内置方法#dates.format 格式化参数四、使用th:each属性循环遍历，注意该属性修改在tr标签上。并使用th:text属性给td标签赋值四、总结一、Thymeleaf 是Spring Boot 官方推荐的Java模版引擎框架，其文件扩展名为.html二、Thymeleaf 几乎支持所有的html属性，用于赋值的th:text和th:value，用于循环遍历的th:each，用于条件判断的th:if三、Thymeleaf 提供四种标准的表达式，有丰富内置方法的${}，用于国际化的#{}，用于代码插入的~{}，用于处理链接的@{}四、一定要注意循环遍历的th:each和代码插入的th:insert用法，尽量避免破坏html结构的细节问题参考文献：//www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#appendix-a-expression-basic-objects//www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#appendix-b-expression-utility-objects
第一部分：选择题 1、下列有关 Excel 工作表命名的说法中,正确的是(C )A、工作表的名字只能以字母开头 B、同一个工作簿可以存在两个同名的工作表 C、工作表的命名应该“见名知义” D、工作簿默认的工作表名称为 Book1 2、下列有关 Excel 工作表单元格的说法中,错误的是(B ) A、每个单元格都有固定的地址 B、同列不同单元格的宽度可以不同 C、若干单元格构成工作表 D、同列不同单元格可以选择不同的数字分类 3、下列关于 Excel 公式或函数的说法中,错误的是（D） A、公式中的乘、除号分别用*、/表示 B、公式复制后,被引用的地址有可能变化 C、公式必须以“=”号开头 D、函数“MAX(A1:C3)”引用了 4 个单元格 4、用鼠标拖放操作复制单元格数据时必须同时按住(C ) A、 B、 C、 D、 5、在 Exce1 工作表中,每个单元格都有唯一的编号叫地址,地址的使用方法是( B) A、字母+数字 B、列标+行号 C、数字+字母 D、行号+列标 6、在 Exce1 操作中,假设 A1,B1,C1,D1 单元分别为 2,3,7,3,则 SUM(A1:C1)/D1 的值 为 （ D） A、15 B、18 C、3 D、4 7、Exce1 中有多个常用的简单函数,其中函数 AVERAGE(区域)的功能是（B ） A、求区域内数据的个数 B、求区城内所有数字的平均值 C、求区城内数字的和 D、返回函数的最大值 8、如果用预置小数的方法输入数据时,当设定小数位数是“2”时,输入 12345 表示 （ D） A、1234500 B、123.45 C、12345 D、12345.00 9、在 EXCEL 中,可使用（ B）中的命令,给选定的单元格加边框 A、视图菜单 B、格式菜单 C、工具菜单 D、窗口菜单 10、在 EXCEL 中,如果我们只需要数据列表中记录的一部分时,可以使用 EXCEL 提 供的（B ）功能 A、排序 B、自动筛选 C、分类汇总 D、以上全部 11、在关系型数据库中储蓄所有多个储户，储户在多个储蓄所存取款，储蓄所与 储户之间是 (D ) A、一对一的联系 B、一对多的联系 C、多对一的联系 D、多对多的联系 12、使用 SQL 语句进行分组检索时，为了去掉不满足条件的分组，应当 （B ） A、使用 WHERE 子句 B、在 GROUP BY 后面使用 HAVING 子句 C、先使用 WHERE 子句，再使用 HAVING 子句 D、先使用 HAVING 子句，再使用 WHERE 子句 13、在 SQL 语句中，与表达式"仓库号 NOT IN（"wh1","wh2"） 功能相同的表 达式是（D ） A、仓库号="wh1" AND 仓库号="wh2" B、仓库号!="wh1" OR 仓库号！= "wh2" C、仓库号="wh1" OR 仓库号="wh2" D、仓库号!="wh1" AND 仓库号!="wh2" 14、设有图书管理数据库： 图书(总编号C(6),分类号C(8),书名C(16),作者C(6),出版单位C(20),单价N(6,2)) 读者(借书证号 C(4),单位 C(8),姓名 C(6),性别 C(2),职称 C(6),地址 C(20)) 借阅(借书证号 C(4),总编号 C(6),借书日期 D(8)) 对于图书管理数据库，分别求出各个单位当前借阅图书的读者人次。下面的 SQL 语句正确的是 （ A ） SELECT 单位,______ FROM 借阅,读者 WHERE;借阅.借书证号=读者.借书证号 __ A、COUNT(借阅.借书证号) ，GROUP BY 单位 B、SUM(借阅.借书证号) ，GROUP BY 单位 C、COUNT(借阅.借书证号)， ORDER BY 单位 D、COUNT(借阅.借书证号) ，HAVING 单位 15、在 EXCEL 中,公式输入完后应按（ A） A、ENTER B、CTRL+ENTER C、SHIFT+ENTER D、CTRL+SHIFT+ENTER 16、EXCEL 的主要功能有（ B） A、电子表格、文字处理、数据库 B、电子表格、图表、数据库 C、工作表、工作簿、图表 D、电子表格、工作簿、数据库 17、在 EXCEL 工作表中,当插入行或列时,后面的行或列将向(A )方向自动移动 A、向下或向右 B、向下或向左 C、向上或向右 D、向上或向左 18、在 EXCEL 中，创建公式的操作步骤有：①在编辑栏键入“=”；②键入公式； ③按 ENTER 键；④选择需要建立公式的单元格；其正确的顺序是（C ） A、①②③④ B、④①③② C、④①②③ D、④③①② 19、在 EXCEL 中,当数据超过单元格的列宽，在单元格中显示的一组符号是（ B） A、？ B、# C、% D、* 20、以下选项中描述正确的是 （D ） A: 数据库设计是指设计数据库管理系统 B: 数据库系统中，数据的物理结构必须与逻辑结构一致 C: 数据库是一个独立的系统，不需要操作系统的支持 D: 数据库技术的根本目标是要解决数据共享的问题 21、EXCEL 中的数据类型有(D ) A、数值型 B、字符型 C、逻辑型 D、以上全部 22、在 excel 中,选定一个单元格后按 DEL 键,将被删除的是(B ) A、单元格 B、单元格中的内容 C、单元格中的内容及格式等 D、单元格所在的行 23、SQL 语言的数据操纵语句包括 SELECT、INSERT、UPDATE、DELETE 等。其 中最重要的，也是使用最频繁的语句是(B )。 A．UPDATE B．SELECT C．DELETE D．INSERT 24、在 Excel 工作表的第 3 行第 4 列的单元格地址是(A ) A、D3 B、D4 C、3D D、4D 25、excel 的每一个工作表最多可包含(C )列 A、255 B、254 C、256 D、没有限定 26、excel 的每一个工作表最多可包含(B )行 A、65535 B、65536 C、60000 D、65555 27、单元格中（C ） A、只能包含数字 B、只能包含文字 C、可以是数字、字符、公式等 D、以上都不是 28、如果要将一单元格中的公式计算结果数值复制到另一单元格中,应选择菜单 (B )A、文件 B、编辑C、格式D、工具 29、数据独立性是数据库技术的重要特点之一，关于数据独立性，以下选项中描 述正确的是 （ D） A: 数据与程序独立存放 B: 不同数据只能被对应的应用程序所使用 C: 不同数据被存放在不同的文件中 D: 以上三种说法都不对 30、在同一个工作簿中要引用其他工作表某个单元格的数据(如 sheet8 单元格中 的数据),下面的表达方式中正确的是( A) A、= sheet8!D8 B、=D8( sheet8) C、+ sheet8!D8 D、$ sheet8>$D8 31、在 SQL 语言中，子查询是（D ）。 A．选取单表中字段子集的查询语句 B．选取多表中字段子集的查询语句 C．返回单表中数据子集的查询语言 D．嵌入到另一个查询语句之中的查询语句 32、下面哪个函数可以返回逻辑值 TRUE (B ) A、AND(TRUE, TRUE, FALSE) B、OR(TRUE, TRUE, FALSE) C、OR(FALSE, FALSE. FALSE) D、NOT(TRUE) 33、若单元格 B2、C2、D2 的内容分别为 2800、89、88,单元格 E2 中有函数 “ =IF(AND(B2>2000,OR(C2>90,D2>90),” 五 星”,IF(AND(B2>1800,OR(C2>85,D2>85)),”四星”,”三星”))”则最终单元格 E2 中显示 的内容为 (C ) A、出错 B、三星 C、四星 D、五星 34、若在单元格中输入函数 MOD(7,-2)，则单元格会显示（A ） A、-1 B、1 B、-3 D、3 35、函数 find(“t”,”yesterday after tomarrow”,5)返回（B ） A、4 B、13 C、17 D、20 36、在视图上不能完成的操作是(D ) A．查询 B．在视图上定义新的视图 C．更新视图 D．在视图上定义新的表 37、下列不能从“yesterday“中取出字符串”yes“的函数是（ C） A、MID(“yesterday”,1,3) B、LEFT(“yesterday”,3) C、MIDB(“yesterday”,1,6) D、RIGHT(MID(“yesterday”,1,3),3) 38、函数 COLUMNE(B1:E5)返回（C ） A、1 B、2 C、4 D、5 39、在下列哪种情况下需要引用绝对地址 (D ) A、当把一个含有单元格地址的公式拷贝到一个新的位置时,为使公式中单元格地 址随新位置而变化 B、当在引用的函数中填入一个范围时,为使函数中的范围随地址位置不同而变化 C、当把一个含有范围的公式或函数拷贝到一个新的位置时,为使公式或函数中范 围随新位置不同而变化 D、当把一个含有范围的公式或函数拷贝到一个新的位置时,为使公式或函数中范 围不随新位置不同而变化 40、以下选项中说法错误的是 （C ） A: DML 是数据操纵语言 B: DCL 是数据控制语言 C: DBMS 是数据库系统 D: DDL 是数据定义语言 41、以下哪种方法属于判别式模型(discriminative model)（D ） A、隐马模型(HMM) B、朴素贝叶斯 C、LDA D、支持向量机 42、以 P(w)表示词条 w 的概率，假设已知 P（南京）=0.8，P（市长）=0.6，P（江 大桥）=0.4：P（南京市）=0.3，P（长江大桥）=0.5：如果假设前后两个词的出 现是独立的，那么分词结果就是（B ） A、南京市长江大桥 B、南京市长江大桥 C、南京市长*江大桥 D、南京市*长江大桥 43、基于统计的分词方法为（D ） A、正向量最大匹配法 B、逆向量最大匹配法 C、最少切分 D、条件随机场 44、下列哪个不属于 CRF 模型对于 HMM 和 MEMM 模型的优势（ B） A、特征灵活 B、速度快 C、可容纳较多上下文信息 D、全局最优 45、在二分类问题中，当测试集的正例和负例数量不均衡时，以下评价方案哪个 是相对不合理的（ A）（假设 precision=TP/(TP+FP),recall=TP/(TP+FN)。） A、Accuracy:(TP+TN)/all B、F-value:2recallprecision/(recall+precision) C、G-mean:sqrt(precision*recall) D、AUC:ROC 曲线下面积 46、下面关于 ID3 算法中说法错误的是（D ） A、ID3 算法要求特征必须离散化 B、信息增益可以用熵，而不是 GINI 系数来计算 C、选取信息增益最大的特征，作为树的根节点 D、ID3 算法是一个二叉树模型 47、如下表是用户是否使用某产品的调查结果： 请计算年龄、地区、学历、收入中对用户是否使用调查产品信息增益最大的属性。 （C ） A、年龄 B、地区 C、学历 D、收入 48.在其它条件不变的前提下，以下哪种做法容易引起机器学习中的过拟合问题 （D ） A、增加训练集数量 B、减少神经网络隐藏层节点数 C、删除稀疏的特征 D、SVM 算法中使用高斯核/RBF 核代替 49.如果线性回归模型中的随机误差存在异方差性，那么参数的 OLS 估计量是 （B ） A、无偏的，有效的 B、无偏的，非有效的 C、有偏的，有效的 D、有偏的，非有效的 50.一个二进制源 X 发出符号集为{-1,1}，经过离散无记忆信道传输，由于信道 中噪音的存在，接收端 Y 收到符号集为{-1,1,0}。已知 P(x=-1)=1/4，P(x=1)=3/4， P(y=-1|x=-1)=4/5，P(y=0|x=-1)=1/5，P(y=1|x=1)=3/4，P(y=0|x=1)=1/4，求条 件熵 H(Y|X)（B ） A、0.2375 B、0.3275 C、0.5273 D、0.5372 51、以下哪种方法不属于特征选择的标准方法：（D ） A、嵌入 B、过滤 C、包装 D、抽样。 51.下面哪种不属于数据预处理的方法？（ D） A、变量代换 B、离散化 C、聚集 D、估计遗漏值。 52.当不知道数据所带标签时，可以使用哪种技术促使带同类标签的数据与带其 他标签的数据相分离？（ B） A 分类 B 聚类 C 关联分析 D 隐马尔可夫链 53.Nave Bayes 是一种特殊的 Bayes 分类器,特征变量是 X,类别标签是 C,它的一 个假定是（ C） A、各类别的先验概率 P(C)是相等的 B、以 0 为均值，sqr(2)/2 为标准差的正态分布 C、特征变量 X 的各个维度是类别条件独立随机变量 D、P(X|C)是高斯分布 54.假定某同学使用 Naive Bayesian（NB）分类模型时，不小心将训练数据的两 个维度搞重复了，那么关于 NB 的说法中不正确的是？（B ） A、模型效果相比无重复特征的情况下精确度会降低 B、如果所有特征都被重复一遍，得到的模型预测结果相对于不重复的情况下的 模型预测结果一样 C、当两列特征高度相关时，无法用两列特征相同时所得到的结论来分析问题 第二部分：问答题（4 题，共 20 分） 问题一、什么是 Tableau？如何从 Tableau 中的提取？ 参考答案： Tableau 是一种商业智能软件，允许任何人连接到相应的数据，然后可视化并创 建交互式的可共享仪表板。 可用于提高性能和离线分析的数据源的已保存子集。 问题二、叙述 tableau 的优势 参考答案： 1）、什么都能连：都能连，不能直连的也可通过 odbc 来连 2）、学习门槛低：官方有最新版本的视频、文本、案例提供。 3）、轻量级：简单拖拉拽就能快速创建一个报表 4）、更智能，比如自动识别维度和度量、自动求和、自动识别关联条件 5）、给人亲切感：能找到 excel、PPT 及其他数据分析工具的身影，功能类似 6）、丰富的图表展示 问题三、存储过程有什么优点？ 参考答案： 存储过程或者函数可以重复使用，可以减少数据库开发人员，尤其是应用程序开 发人员的工作量。 使用存储过程或者函数可以增强数据的安全访问控制。可以设定只有某些数据库 用户才具有某些存储过程或者函数的执行权。 问题四、什么是触发器？严格的说触发器有哪几种？触发器有什么优点？ 参考答案： 触发器主要用于监视某个表的 insert、update 以及 delete 等更新操作，这些操作 可以分别激活该表的 insert、update 或者 delete 类型的触发程序运行，从而实现 数据的自动维护。 使用触发器有如下优点： 1.自动执行。触发器在对表的数据作了任何修改（比如手工输入或者应用程序的 操作）之后立即被激活。 2.级联更新。触发器可以通过数据库中的相关表进行层叠更改，这比直接把代码 写在前台的做法更安全合理。 3.强化约束。触发器可以引用其它表中的列，能够实现比 CHECK 约束更为复杂 的约束。 4.跟踪变化。触发器可以阻止数据库中未经许可的指定更新和变化。强制业务逻辑。触发器可用于执行管理任务，并强制影响数据库的复杂业务规 则。问题五、哪些机器学习算法不需要做归一化处理？ 参考答案： 概率模型不需要归一化，因为它们不关心变量的值，而是关心变量的分布和变量 之间的条件概率，如决策树、rf。而像 adaboost、svm、lr、KNN、KMeans 之类 的最优化问题就需要归一化。 我理解归一化和标准化主要是为了使计算更方便 比如两个变量的量纲不同 可 能一个的数值远大于另一个那么他们同时作为变量的时候 可能会造成数值计算 的问题，比如说求矩阵的逆可能很不精确 或者梯度下降法的收敛比较困难，还 有如果需要计算欧式距离的话可能 量纲也需要调整 所以我估计 lr 和 knn 保 准话一下应该有好处。至于其他的算法 我也觉得如果变量量纲差距很大的话 先 标准化一下会有好处。一般我习惯说树形模型，这里说的概率模型可能是差不多 的意思。 问题六、数据归一化（或者标准化，注意归一化和标准化不同）的原因 参考答案： 要强调：能不归一化最好不归一化，之所以进行数据归一化是因为各维度的 量纲不相同。而且需要看情况进行归一化。 有些模型在各维度进行了不均匀的伸缩后，最优解与原来不等价（如 SVM） 需要归一化。 有些模型伸缩有与原来等价，如：LR 则不用归一化，但是实际中往往通过迭 代求解模型参数，如果目标函数太扁（想象一下很扁的高斯模型）迭代算法会发 生不收敛的情况，所以最坏进行数据归一化。 问题七、哪些机器学习算法不需要做归一化处理？（10 分） 参考答案： 概率模型不需要归一化，因为它们不关心变量的值，而是关心变量的分布和 变量之间的条件概率，如决策树、rf。而像 adaboost、svm、lr、KNN、KMeans 之类的最优化问题就需要归一化。 我理解归一化和标准化主要是为了使计算更方便 比如两个变量的量纲不同 可能一个的数值远大于另一个那么他们同时作为变量的时候 可能会造成数值计 算的问题，比如说求矩阵的逆可能很不精确 或者梯度下降法的收敛比较困难， 还有如果需要计算欧式距离的话可能 量纲也需要调整 所以我估计 lr 和 knn 保准话一下应该有好处。至于其他的算法 我也觉得如果变量量纲差距很大的话 先标准化一下会有好处。一般我习惯说树形模型，这里说的概率模型可能是差不 多的意思。 问题八、数据归一化（或者标准化，注意归一化和标准化不同）的原因（10 分） 参考答案： 要强调：能不归一化最好不归一化，之所以进行数据归一化是因为各维度的量纲 不相同。而且需要看情况进行归一化。 有些模型在各维度进行了不均匀的伸缩后，最优解与原来不等价（如 SVM）需要归一化。 有些模型伸缩有与原来等价，如：LR 则不用归一化，但是实际中往往通 过迭代求解模型参数，如果目标函数太扁（想象一下很扁的高斯模型）迭代算法 会发生不收敛的情况，所以最坏进行数据归一化。
取得list的长度：${list?size} 用?size不是用?length${list?size}freemarker中list的遍历循环<#if list?? && (list?size gt 0)> <#list list as data> 名称:${data.name!} </#list> </#if>list中有object,获取object的值<#if lists?? && lists.tag_key?? && (tagliststag_key?size) gt 0 > <#list 0..lists.tag_key?size-1 as i> ${lists.tag_key[i]} ${lists.tag_url[i]} </#list> <#else>
查看官方友盟推送文档文档的意思我一开始也没看懂，后来发现这里可能是这个意思：你可以传进来字符串或者json串，如果是字符串，UMeng那边就默认它是内容，如果是json串的话，格式要像它给的那样，UMeng那边就会解析你传进来的东西。这里，如果想设置title，就把title和body封装成json串，在你程序里应用的sdk中重写setAlert方法，像这样： public void setAlert(JSONObject token) throws Exception { setPredefinedKeyValue("alert", token); }之后再把你封装的json串传进来就可以了。像这样：JSONObject alert = new JSONObject(); alert.put("title",ticker); alert.put("subtitle",title); alert.put("body",content); broadcast.setAlert(alert);之后就大功告成了，亲测可以用！iOS推送调用的所有参数:{ "appkey":"xx", // 必填，应用唯一标识 "timestamp":"xx", // 必填，时间戳，10位或者13位均可，时间戳有效期为10分钟 "type":"xx", // 必填，消息发送类型,其值可以为: // unicast-单播 // listcast-列播，要求不超过500个device_token // filecast-文件播，多个device_token可通过文件形式批量发送 // broadcast-广播 // groupcast-组播，按照filter筛选用户群, 请参照filter参数 // customizedcast，通过alias进行推送，包括以下两种case: // - alias: 对单个或者多个alias进行推送 // - file_id: 将alias存放到文件后，根据file_id来推送 "device_tokens":"xx", // 当type=unicast时, 必填, 表示指定的单个设备 // 当type=listcast时, 必填, 要求不超过500个, 以英文逗号分隔 "alias_type": "xx", // 当type=customizedcast时, 必填 // alias的类型, alias_type可由开发者自定义, 开发者在SDK中 // 调用setAlias(alias, alias_type)时所设置的alias_type "alias":"xx", // 当type=customizedcast时, 选填(此参数和file_id二选一) // 开发者填写自己的alias, 要求不超过500个alias, 多个alias以英文逗号间隔 // 在SDK中调用setAlias(alias, alias_type)时所设置的alias "file_id":"xx", // 当type=filecast时，必填，file内容为多条device_token，以回车符分割 // 当type=customizedcast时，选填(此参数和alias二选一) // file内容为多条alias，以回车符分隔。注意同一个文件内的alias所对应 // 的alias_type必须和接口参数alias_type一致。 // 使用文件播需要先调用文件上传接口获取file_id，参照"2.4文件上传接口" "filter":{}, // 当type=groupcast时，必填，用户筛选条件，如用户标签、渠道等，参考附录G。 "payload": // 必填，JSON格式，具体消息内容(iOS最大为2012B) { "aps": // 必填，严格按照APNs定义来填写 { "alert":""/{ // 当content-available=1时(静默推送)，可选; 否则必填。 // 可为JSON类型和字符串类型 "title":"title", "subtitle":"subtitle", "body":"body" } "badge": xx, // 可选 "sound": "xx", // 可选 "content-available":1 // 可选，代表静默推送 "category": "xx", // 可选，注意: ios8才支持该字段。 }, "key1":"value1", // 可选，用户自定义内容, "d","p"为友盟保留字段， // key不可以是"d","p" "key2":"value2", ... }, "policy": // 可选，发送策略 { "start_time":"xx", // 可选，定时发送时间，若不填写表示立即发送。 // 定时发送时间不能小于当前时间 // 格式: "yyyy-MM-dd HH:mm:ss"。 // 注意，start_time只对任务生效。 "expire_time":"xx", // 可选，消息过期时间，其值不可小于发送时间或者 // start_time(如果填写了的话), // 如果不填写此参数，默认为3天后过期。格式同start_time "out_biz_no": "xx" // 可选，开发者对消息的唯一标识，服务器会根据这个标识避免重复发送。 // 有些情况下（例如网络异常）开发者可能会重复调用API导致 // 消息多次下发到客户端。如果需要处理这种情况，可以考虑此参数。 // 注意，out_biz_no只对任务生效。 "apns_collapse_id": "xx" // 可选，多条带有相同apns_collapse_id的消息，iOS设备仅展示 // 最新的一条，字段长度不得超过64bytes }, "production_mode":"true/false" // 可选，正式/测试模式。默认为true // 测试模式只对“广播”、“组播”类消息生效，其他类型的消息任务（如“文件播”）不会走测试模式 // 测试模式只会将消息发给测试设备。测试设备需要到web上添加。 "description": "xx" // 可选，发送消息描述，建议填写。 }
1.首先去hive.apache.org 官网去下载对应版本的gz包2.解压缩gz tar -zxvf xxxx.tar.gz -C /usr/local/webserver3.进入 config 创建hive-site.xml 文件增加<configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost:3306/hive?createDatabaseIfNotExist=true</value><description>JDBC connect string for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> <description>Driver class name for a JDBC metastore</description> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> <description>username to use against metastore database</description> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> <description>password to use against metastore database</description> </property> </configuration>4.将 hive 的 lib 中的 jline.2.12.jar 替换掉 hadoop2.6.4/share/hadoop/yarn/lib/jline.0.94.jar5. 执行命令 初始化 mysql的 hive库./schematool -dbType mysql -initSchema
1.解压flume 到/usr/local/webserver/文件夹下2.自定义 .config 名字随意起定义三大组件的名称ag1.sources = source1 ag1.sinks = sink1 ag1.channels = channel1配置source组件ag1.sources.source1.type = spooldir #行为特点是 只要目录出现新的日志文件 就会读取 ag1.sources.source1.spoolDir = /root/log/ ag1.sources.source1.fileSuffix=.FINISHED采集数据一行的最大Kag1.sources.source1.deserializer.maxLineLength=5120 配置sink组件ag1.sinks.sink1.type = hdfs ag1.sinks.sink1.hdfs.path =hdfs://hdp-01:9000/access_log/%y-%m-%d/%H-%M #文件夹路径 ag1.sinks.sink1.hdfs.filePrefix = app_log # 前缀 ag1.sinks.sink1.hdfs.fileSuffix = .log #后缀 ag1.sinks.sink1.hdfs.batchSize= 100 #多少条数据刷一次hdfs ag1.sinks.sink1.hdfs.fileType = DataStream #文件类型 ag1.sinks.sink1.hdfs.writeFormat =Text #写到hdfs上 用Text ## roll：滚动切换：控制写文件的切换规则 ag1.sinks.sink1.hdfs.rollSize = 512000 ## 按文件体积（字节）来切 500K 切切一次 ag1.sinks.sink1.hdfs.rollCount = 1000000 ## 按event条数切 按照多少条记录切一次 ag1.sinks.sink1.hdfs.rollInterval = 60 ## 按时间间隔切换文件 60秒切一次 ## 控制生成目录的规则 ag1.sinks.sink1.hdfs.round = true #是否切换目录 ag1.sinks.sink1.hdfs.roundValue = 10 #10分组切一次 ag1.sinks.sink1.hdfs.roundUnit = minute #分钟 ag1.sinks.sink1.hdfs.useLocalTimeStamp = true #使用本地的时间戳取时间channel组件配置ag1.channels.channel1.type = memory ag1.channels.channel1.capacity = 500000 ## event条数 容量 50W条 ag1.channels.channel1.transactionCapacity = 600 ##flume事务控制所需要的缓存容量600条event绑定source、channel和sink之间的连接ag1.sources.source1.channels = channel1 ag1.sinks.sink1.channel = channel1启动 flumebin/flume-ng agent -c conf/ -f dir-hdfs.conf -n ag1 -Dflume.root.logger=INFO,console-c 配置文件目录-f 采集文件配置-n ag1-Dflume.root.logger=INFO,console 打印 日志到控制台配置2tail-hdfs.conftail-hdfs.conf用tail命令获取数据，下沉到hdfs启动命令：bin/flume-ng agent -c conf -f conf/tail-hdfs.conf -n a1 # Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = exec a1.sources.r1.command = tail -F /root/app_weichat_login.log # Describe the sink agent1.sinks.sink1.type = hdfs agent1.sinks.sink1.hdfs.path =hdfs://hdp20-01:9000/app_weichat_login_log/%y-%m-%d/%H-%M agent1.sinks.sink1.hdfs.filePrefix = weichat_log agent1.sinks.sink1.hdfs.fileSuffix = .dat agent1.sinks.sink1.hdfs.batchSize= 100 agent1.sinks.sink1.hdfs.fileType = DataStream agent1.sinks.sink1.hdfs.writeFormat =Text agent1.sinks.sink1.hdfs.rollSize = 100 agent1.sinks.sink1.hdfs.rollCount = 1000000 agent1.sinks.sink1.hdfs.rollInterval = 60 agent1.sinks.sink1.hdfs.round = true agent1.sinks.sink1.hdfs.roundValue = 1 agent1.sinks.sink1.hdfs.roundUnit = minute agent1.sinks.sink1.hdfs.useLocalTimeStamp = true # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1两个agent 级联串联 flume 采集数据 发送到另一个 flume上处理数据 最后存到hdfs发送消息客户端配置tail-avro.conf从tail命令获取数据发送到avro端口另一个节点可配置一个avro源来中继数据，发送外部存储################## # Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source a1.sources.r1.type = exec a1.sources.r1.command = tail -F /root/log/access.log # Describe the sink a1.sinks.k1.type = avro a1.sinks.k1.hostname = hdp-05 #目标主机 a1.sinks.k1.port = 4141 #目标端口 a1.sinks.k1.batch-size = 2 #2条发一次 # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1发送消息服务端配置avro-hdfs.conf从avro端口接收数据，下沉到hdfsbin/flume-ng agent -c conf -f conf/avro-m-log.conf -n a1 -Dflume.root.logger=INFO,console采集配置文件，avro-hdfs.conf# Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe/configure the source ##source中的avro组件是一个接收者服务 a1.sources.r1.type = avro a1.sources.r1.bind = hdp-05 a1.sources.r1.port = 4141 # Describe the sink a1.sinks.k1.type = hdfs a1.sinks.k1.hdfs.path = /flume/taildata/%y-%m-%d/ a1.sinks.k1.hdfs.filePrefix = tail- a1.sinks.k1.hdfs.round = true a1.sinks.k1.hdfs.roundValue = 24 a1.sinks.k1.hdfs.roundUnit = hour a1.sinks.k1.hdfs.rollInterval = 0 a1.sinks.k1.hdfs.rollSize = 0 a1.sinks.k1.hdfs.rollCount = 50 a1.sinks.k1.hdfs.batchSize = 10 a1.sinks.k1.hdfs.useLocalTimeStamp = true #生成的文件类型，默认是Sequencefile，可用DataStream，则为普通文本 a1.sinks.k1.hdfs.fileType = DataStream # Use a channel which buffers events in memory a1.channels.c1.type = memory a1.channels.c1.capacity = 1000 a1.channels.c1.transactionCapacity = 100 # Bind the source and sink to the channel a1.sources.r1.channels = c1 a1.sinks.k1.channel = c1发送数据：$ bin/flume-ng avro-client -H localhost -p 4141 -F /usr/logs/log.10