索引类型描述其他信息 哈希 借助于哈希索引,可通过内存中的哈希表来访问数据。 哈希索引的内存用量固定不变,是存储桶数量的函数。 在内存优化表上使用索引的准则哈希索引设计指南 内存优化非聚集索引 对于内存优化的非聚集索引,内存使用量依赖于行计数以及索引键列的大小 在内存优化表上使用索引的准则内存优化非聚集索引设计指南 聚集 聚集索引基于聚集索引键按顺序排序和存储表或视图中的数据行。 聚集索引按 B 树索引结构实现,B 树索引结构支持基于聚集索引键值对行进行快速检索。 描述的聚集索引和非聚集索引创建聚集索引聚集索引设计指南 非聚集 既可以使用聚集索引来为表或视图定义非聚集索引,也可以根据堆来定义非聚集索引。 非聚集索引中的每个索引行都包含非聚集键值和行定位符。 此定位符指向聚集索引或堆中包含该键值的数据行。 索引中的行按索引键值的顺序存储,但是不保证数据行按任何特定顺序存储,除非对表创建聚集索引。 描述的聚集索引和非聚集索引创建非聚集索引非聚集索引设计指南 唯一 唯一索引确保索引键不包含重复的值,因此,表或视图中的每一行在某种程度上是唯一的。唯一性可以是聚集索引和非聚集索引的属性。 创建唯一索引唯一索引设计指南 列存储 内存中列存储索引通过使用基于列的数据存储和基于列的查询处理来存储和管理数据。列存储索引适合于主要执行大容量加载和只读查询的数据仓库工作负荷。 与传统面向行的存储方式相比,使用列存储索引存档可最多提高 10 倍查询性能 ,与使用非压缩数据大小相比,可提供多达 7 倍数据压缩率 。 列存储索引指南列存储索引设计指南 带有包含列的索引 一种非聚集索引,它扩展后不仅包含键列,还包含非键列。 创建带有包含列的索引 计算列上的索引 从一个或多个其他列的值或某些确定的输入值派生的列上的索引。 计算列上的索引 Filtered 一种经过优化的非聚集索引,尤其适用于涵盖从定义完善的数据子集中选择数据的查询。 筛选索引使用筛选谓词对表中的部分行进行索引。 与全表索引相比,设计良好的筛选索引可以提高查询性能、减少索引维护开销并可降低索引存储开销。 创建筛选索引筛选索引设计指南 空间 利用空间索引,可以更高效地对几何数据类型的列中的空间对象( 空间数据 )执行某些操作。 空间索引可减少需要应用开销相对较大的空间操作的对象数。 空间索引概述 XML xml 数据类型列中 XML 二进制大型对象 (BLOB) 的已拆分持久表示形式。 XML 索引 (SQL Server) 全文 一种特殊类型的基于令牌的功能索引,由 Microsoft Full-Text 引擎为 SQL Server 生成和维护。 用于帮助在字符串数据中搜索复杂的词。 填充全文索引
用法一说明: SELECT case -------------如果 when sex='1' then '男' -------------sex='1',则返回值'男' when sex='2' then '女' -------------sex='2',则返回值'女' else 0 -------------其他的返回'其他’ end -------------结束from sys_user --------整体理解: 在sys_user表中如果sex='1',则返回值'男'如果sex='2',则返回值'女' 否则返回'其他’
用法二说明: SELECT STATE CASE WHEN '1' THEN '成功' WHEN '2' THEN '失败' ELSE '其他' END FROM SYS_SCHEDULER
今日学习内容总结 在上周的学习中,我们已经对前端的学习迈开脚步了。我们了解了什么是前端,所以接下来的学习依旧是以前端为主的学习。在上周的学习中,我们首先学习HTML语言。HTML是一门标签语言,并不是编程语言。我们对html的学习其实主要是对html中的标签进行学习。而今天主要学习的就是,让标签具有独特的表现形式的方法。css方法。
from表单 在了解css之前,我们需要对from表单进行了解学习。
from表单简介 表单在Web网页中用以让访问者输入数据,当提交表单时,表单中输入的数据被打包传递给Web服务器端的程序以处理,从而使得Web服务器与用户之间具有交互功能。表单实现前后台交互:用户将表单提交到后台再右后台提交到数据库的过程,实现前后端交互。
表单在网页中主要负责数据采集功能,它用< form >标签定义。用户输入的信息都要包含在form标签中,点击提交后,< form >和</ form >里面包含的数据将被提交到服务器或者电子邮件里。所有的用户输入内容的地方都用表单来写,如登录注册、搜索框。
表单是由窗体和控件组成的,一个表单一般应该包含用户填 写信息的输入框,提交按钮等,这些输入框,按钮叫做控件,表单很像容器,它能够容纳各种各样的控件。
from表单的属性 # 表单标签的格式 < form action=url method=get|post name=“myform” >< /form > 1. name: 表单提交时的名称 2. action: 提交到的地址 3. method:提交方式,默认为get from表单属性
action属性
# from支持HTML的全局属性 # action 控制数据的提交地址 # 方式1:写全路径 action=http://www.aa7a.cn/user.php # 方式2:写后缀(自动补全IP和PORT) action=user.php # 方式3:不写(朝网页所在的地址提交) action= input标签
# input标签 获取用户各中类型数据的标签 input标签的三个重要属性 1. type 他是代表input的类型 2. name 他就是后台取值的依据(key) 3.
写在前面 最近被Hyperledger Fabric折磨,归根结底还是因为自己太菜了qwq。学习路漫漫,笔记不能少。下面的步骤均是基于已经成功搭建了Fabric2.2环境,并且拉取fabric-samples文件夹了。
一、启动测试网络 打开终端进入test-network目录下。我的具体目录是: /workspace/fabric-samples/test-network,因此有命令:
cd /workspace/fabric-samples/test-network 在使用./network.sh命令前,可以先查看选项说明。
./network.sh -h 要是不想看问题也不大,跟着我走就好。(๑>ڡ<)☆
下面正式开始!
首先启动网络。注意下面这个命令只是启动网络并没有创建通道。
./network.sh up 启动网络后,接着创建通道。由于这里并没有指定通道的名字,此时默认为mychannel.
./network.sh createChannel 其实上述两步可以用一条命令实现,那就是:
./network.sh up createChannel 之后,将bin目录中二进制文件添加到 CLI 路径。
export PATH=${PWD}/../bin:$PATH 设置FABRIC_CFG_PATH为指向fabric-samples中的core.yaml文件。
export FABRIC_CFG_PATH=$PWD/../config/ 二、安装链码 根据官方文档可以知道,Fabric链码生命周期需要组织同意定义一个链码的参数,比如说名称、版本以及链码背书策略。通道成员通过以下四步达成共识。不是通道上的每一个组织都需要完成每一步。
1.打包链码。这一步可以被一个或者每一个组织完成。
2.安装链码在你的peer节点上。每一个用链码的组织都需要完成。
3.为你的组织批准链码定义。使用链码的每一个组织都需要完成这一步。链码能够在通道上运行之前,链码定义需要被足够多的组织批准来满足通道的生命周期背书(LifecycleEndorsement)策略(默认为大多数组织)。
4.提交链码定义到链上。一旦通道所需数量的组织已经同意,提交交易需要被提交。提交者首先从已同意组织中的足够的peer节点中收集背书,然后通过提交链码声明。
显然,下面要进行的第一步是打包链码。链码需要被打包成一个tar文件。
1.打包链码 下面使用peer lifecycle chaincode package命令创建链码包
peer lifecycle chaincode package fabcar.tar.gz --path ../chaincode/fabcar/go/ --lang golang --label fabcar_1 说明:① 命令中--path指的是 将指定目录(.
task1
import randomprint('用列表存储随机整数: ')ls = [random.randint(1, 100) for i in range(5)]print(ls)print('\n用集合存储随机整数: ')s1 = {random.randint(1,100) for i in range(5)}print(s1)print('\n用集合存储随机整数: ')s2 = set()while(len(s2)<5): s2.add(random.randint(1,100))print(s2)
实验一:
问题1: random.randint(1,100) 生成的随机整数范围是?能否取到100? [1,100] 问题2:利用 list(range(5)) 生成的有序序列范围是?是否包括5?(0,1,2,3,4) 利用 list(range(1,5)) 生成的有序序列范围是?是否包括5?(1,2,3,4) 问题3:使用line8生成的集合s1,len(s1)一定是5吗?不一定 问题4:使用line12-14生成的集合s2,len(s2)一定是5吗?一定 task2
datas = {'2049777001': ['篮球', '羽毛球', '美食', '漫画'],'2049777002': ['音乐', '旅行'],'2049777003': ['马拉松', '健身', '游戏'],'2049777004': [],'2049777005': ['足球', '阅读'],'2049777006': ['发呆', '闲逛'],'2049777007': [],'2049777008': ['书法', '电影'],'2049777009': ['音乐', '阅读', '电影', '漫画'],'2049777010': ['数学', '推理', '音乐', '旅行']}list1=list(datas.values())s=set()list2=[]print(list1)for i in list1: for b in i: s.
https://www.weixueyuan.net/nginx/
Nginx是什么 Nginx(发音同“engine x”)是一个高性能的反向代理和 Web 服务器软件,最初是由俄罗斯人 Igor Sysoev 开发的。Nginx 的第一个版本发布于 2004 年,其源代码基于双条款 BSD 许可证发布,因其系统资源消耗低、运行稳定且具有高性能的并发处理能力等特性,Nginx 在互联网企业中得到广泛应用。Nginx 是互联网上最受欢迎的开源 Web 服务器之一,它不仅提供了用于开发和交付的一整套应用技术,还是应用交付领域的开源领导者。Netcraft 公司 2019 年 7 月的统计数据表明,Nginx 为全球最繁忙网站中的 25.42% 提供了服务或代理,进一步扩大了其在主机域名领域的占有量,新增 5220 万个站点,总数达 4.4 亿个,市场占有率已经超过 Apache 4.89%。得益于近几年云计算和微服务的快速发展,Nginx 因在其中发挥了自身优势而得到广泛应用,且有望在未来占有更多的市场份额。2019 年 3 月,著名硬件负载均衡厂商 F5 宣布收购 Nginx,Nginx 成为 F5 的一部分。F5 表示,将加强对开源和 Nginx 应用平台的投资,致力于 Nginx 开源技术、开发人员和社区的发展,更大的投资将为开放源码计划注入新的活力,会主办更多的开放源码活动,并产生更多的开放源码内容。 1、Nginx 的不同版本 作为最受欢迎的 Web 服务器之一,Nginx 自 2004 年发布以来已经得到很多互联网企业的应用。官方目前有 Nginx 开源版和 Nginx Plus 商业版两个版本,开源版是目前使用最多的版本,商业版除了包含开源版本的全部功能外,还提供了一些独有的企业级功能。Nginx 在国内互联网企业中也得到了广泛应用,企业在实际使用中会根据自身的需求进行相应的扩展和增强。目前国内流行的 Nginx 主要有两个开源版本,分别是由淘宝网技术团队维护的 Tengine 项目和由章亦春发起的 OpenResty 项目。 1) 开源版 Nginx Nginx 开源版一直处于活跃开发状态,由 Nginx 公司负责开发与维护。截至本教程写作时,Nginx 开源版本已经更新到 1.
1.请分析SparkSQL出现的原因,并简述SparkSQL的起源与发展。
因为关系数据库已经很流行,而且关系数据库在大数据时代已经不能满足要求。首先,用户需要从不同数据源执行各种操作,包括结构化、半结构化和非结构化数据。其次,用户需要执行高级分析,比如机器学习和图像处理。在实际大数据应用中,经常需要融合关系查询和复杂分析算法(比如机器学习或图像处理),但是,缺少这样的系统。
Spark SQL填补了这个鸿沟:首先,可以提供DataFrame API,可以对内部和外部各种数据源执行各种关系型操作。其次,可以支持大数据中的大量数据源和数据分析算法Spark SQL可以融合:传统关系数据库的结构化数据管理能力和机器学习算法的数据处理能力。
2. 简述RDD 和DataFrame的联系与区别?
区别: RDD是分布式的java对象的集合,但是对象内部结构对于RDD而言却是不可知的。 DataFrame是一种以RDD为基础的分布式数据集,提供了详细的结构信息,相当于关系数据库中的一张表。
联系: 1.都是spark平台下的分布式弹性数据集,为处理超大型数据提供便利。 2、都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action才会运算。 3.都会根据spark的内存情况自动缓存运算,这样即使数据量很大,也不用担心会内存溢出 4、三者都有partition的概念。 5.三者有许多共同的函数,如filter,排序等。
3.DataFrame的创建
spark.read.text(url)
spark.read.json(url) spark.read.format(text).load(people.txt)
spark.read.format(json).load(people.json)
描述从不同文件类型生成DataFrame的区别。
text文件生成的DataFrame只有value属性;而json文件生成的DataFrame会识别到文件中的键值。
用相同的txt或json文件,同时创建RDD,比较RDD与DataFrame的区别。
相同的文件创建RDD和DataFrame,RDD对文件中的结构是不可知的,而DataFrame对文件中的数据结构是可以解析出来的。
4. PySpark-DataFrame各种常用操作
打印数据 df.show()默认打印前20条数据
打印概要 df.printSchema()
查询总行数 df.count()
df.head(3) #list类型,list中每个元素是Row类
输出全部行 df.collect() #list类型,list中每个元素是Row类
查询概况 df.describe().show()
取列 df[‘name’], df.name, df[1]
安装JDK
一、查看Linux默认的JDK
rpm -qa|grep java 例如:
tzdata‐java‐2014g‐1.el6.noarch java‐1.6.0‐openjdk‐1.6.0.0‐11.1.13.4.el6.x86_64 java‐1.7.0‐openjdk‐1.7.0.65‐2.5.1.2.el6_5.x86_64 继而查看配置后的是那个版本:
java -version 解压新版本:
tar -zxvf jdk-8u211-linux-x64.tar.gz -C /opt/module/ 更改配置文件vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_311 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 重新加载配置文件
source /etc/profile 在查看版本是否已经是安装的新版本,如果不是,则删除检测出的新版本
rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-11.1.13.4.el6.x86_64 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.65-2.5.1.2.el6_5.x86_64 重新加载配置文件就是安装的新版本。
MySQL工作流程 连接器->查询缓存->解析器->优化器->执行器
连接器 当你在客户端输入 mysql –u $user –p $pwd 连接 mysql 的时候,接待你的就是连接器。连接器的作用就是和客户端建立连接、获取权限、维持和管理连接。 查询缓存 建立连接后,就可以执行select语句了。首先MySQL会去查看查询缓存,看下之前是否已经执行过这条查询语句。如果命中缓存,就直接返回。否则就扔给解析器。 解析器 MySQL需要知道你想做什么,因此我们就来到了解析器。解析器会做词法分析和语法分析。词法分析主要是分析每个词的含义,语法分析会判断你写的 SQL 语句是否满足 SQL 语法。 优化器 经过解析器,MySQL就知道你想做什么了。但是在开始执行之前,还需要经过优化器的处理。优化器会优化你的SQL语句。生成最终的执行方案 (execution plan)。然后进入执行器阶段。 执行器 执行器首先会判断你对这张表有没有相应的权限。如果没有,就报错。如果有,就调用相应的存储引擎接口,执行语句。然后将结果集返回给客户端。 MySQL 的存储引擎是插件式的。不同的存储引擎支持不同的特性。 # 查看MySQL支持哪些存储引擎 SHOW ENGINES; # 查看默认存储引擎 SHOW VARIABLES LIKE ‘%storage_engine%’; # 查看某张表的存储引擎 SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA='$db' AND TABLE_NAME='$table'; #MyISAM MySQL 5.5 之前默认的存储引擎 特点: a. 查询速度很快 b. 支持表锁 <--重点 c. 支持全文索引(正排索引、倒排索引) d. 不支持事务 <--重点 .frm # 存储表结构,是任何存储引擎都有的 .myd # 存放数据 .
基本数据类型转换 整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级:byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
不能对boolean类型进行类型转换。
不能把对象类型转换成不相关类的对象。
在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
1. 自动类型转换 容量小的类型自动转换为容量大的数据类型。
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
//例: public class VarTest1{ public static void main(String[] args){ byte b1 = 2; int i1 = b1;//byte自动转换类型为int System.out.println(i1); } } 2. 强制类型转换 条件是转换的数据类型必须是兼容的。
格式:(type)value type是要强制类型转换后的数据类型
转换过程中可能导致溢出或损失精度
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入