云计算复习索引(上)

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 以下所有内容可能有误,请自行甄别一. HBase && Spark1. HBase① Shell删除的区别(来自网络 && 个人总结):② IDE 下 CRUD2. Spark(Shell下)①从外部数据源创建DataFrame②根据JSON数据转化为二维表③Spark SQL④DataFrame基本操作

以下所有内容可能有误,请自行甄别


一. HBase && Spark


1. HBase


启动集群后:

91f9f73c0aa947bd9d484d896c799a6c.png

① Shell


  1. 建表
    create用来建表
    create "apple","base_info"
    其中,apple为表名,base_info为列族,列族至少有一个

3d66133c5d2c49ea897a120b9687cbea.png


查看所创建的表:

b1058f3b990a4e6badf6aec16c8d5eb9.png

  1. 插入数据
    put 命令用来插入
    put "apple","0001","base_info:weight","89"


其中apple为表名,0001为行键,base_info为列族(必须是已经创建了的),weight为列名,89为具体的值

eeb7e3411fd94ad5a7bac0fe047f17c3.png


其余可参考

296cdcbecf8144c8bc82a2ac7546907f.png


在上图中,在创建表的时候,可以用命令:

create "Student","Stuinfo","Grades"

列族是可以后续添加的,比如:

alter "apple","extra_info"

再插入数据:

put "apple","0001","extra_info:grade","good"


然后继续插入信息可以查看到更新后的表信息:

b9b3e9f54b264c21a87cd2bdd7d7d8c9.png


  1. 浏览数据
    get命令可以用来获取表中的数据
    get "apple","0001"
    其中,apple为表名,0001为行键
    可以看见:


38df078375214f6fb86ab99c9b06a972.png


scan "apple"用来获取所有的信息

apple为表名


db31dd5784424ab9a4882fbe1398b7da.png


在结果中我们可以看到两部分

第一部分是:ROW为0001

第二部分是:COLUMN(包含列的名字列族:列名的形式)+CELL(时间戳和值)

指定获取某个值:

get "apple","0001","base_info:weight"

其中,apple为表名,0001为行键,base_info为列族,weight为列名


8da65684e0374a8d819379c63699e9b1.png


  1. 分析
    HBase的插入删除操作与关系型数据库(e.g. MySQL)的区别 感觉必考


插入的区别(个人总结,可能不对):

HBase一次只能插入一个表一个列族某单元格的数据,插入时自动加时间戳。而MySQL再插入的过程中,不会自动加时间戳,而且必须要严格按照表的结构来进行插入,也就说在MySQL中是没有办法通过列来进行插入的,但是HBase是可以的(HBase插入要提供表名、行键的名称、列族和列的名称,列名是临时定义的,列族里的列可以随意扩展,极大程度上扩大了数据的存储结构,这也决定了HBase适合大数据的存储、具有高效性的特点)。


在执行的插入命令方面,HBase通过命令put来进行插入,而MySQL通过insert命令来进行插入。


底层方面:在MySQL(不仅仅是MySQL,是包括MySQL所有的关系型数据库)的底层方面,是通过关系代数的运算来实现的,而HBase操作则不存在复杂的表与表之间的关系,只有简单的插入、查询、删除、清空等。


删除的区别(来自网络 && 个人总结):


  1. 删除的方式不同

HBase不会定位到需要删除或更新的记录进行操作。由于HBase底层依赖HDFS,对于HBase删除操作来说,HBase无法在查询到之前的数据并进行修改,只能顺序读写,追加记录。为了更新或删除数据,HBase会插入一条一模一样的新的数据,但是key type会标记成Delete状态,以标记该记录被删除了。在读取的时候如果取到了是Delete,而且时间是最新的,那么这条记录肯定是被删掉了,从而达到删除的目的。

对于关系型数据库来说,进行删除会直接将二维表中的某一行删除掉

  1. 删除的粒度不同

在HBase中进行删除的时候,如果使用命令delete ,可以从表中删除一个单元格或一个行集,语法与 put 类似,必须指明表名和列族名称,而列名和时间戳是可选的。删除的粒度可以是单元格或者是一个行集,要想删除一整个数据,要使用deleteall(原因是:delete 命令不能跨列族操作,如需删除表中所有列族在某一行上的数据,即删除上表中一个逻辑行,则需要使用 deleteall 命令,不需要指定列族和列的名称,只需要指定表明和行键即可);但是在关系型数据库中,不能够删除一个单元格,在关系型数据库中删除的最小粒度是行,即二维表中的一整条数据。

3.使用的命令不同

在关系型数据库中(以MySQL为例),可以使用delete或者是truncate 进行删除,前者可以根据一定的条件进行删除,而后者是删除整个表。在HBase中,删除的命令是delete 和 deleteall,前者用于删除单元格或者是行集(在某一个列组内删除),后者是删除整个逻辑行(跨越列族的限制)


② IDE 下 CRUD


给定JSON or XML数据

比如:

80dfd96b0a554ac995e438a874ad3eac.png


或者是:

165f782b118148bda48b9fb63b1e9247.png


或者是xml格式:

049325cad3fe414fba5294df9ebb9163.png


转换为二维表就是:

1009b6bb44ef48faa6085255a472b6f0.png


  1. 连接数据库
public static void getConnect() throws IOException
{
    conf.set("hbase.zookeeper.quorum", "master315");
    conf.set("hbase.zookeeper.property.clientPort", "2181");
    //conf.set("zookeeper.znode.parent", "/hbase");
    try{ connection=ConnectionFactory.createConnection(conf);  }
    catch(IOException e){     }
}


其中master315为主机名


2. 创建表

//创建一张表,通过HBaseAdmin HTableDescriptor来创建  
public static void createTable(String tablename) throws Exception {
    TableName tableName = TableName.valueOf(tablename);
    Admin admin = connection.getAdmin();
    if (admin.tableExists(tableName)) {
        admin.disableTable(tableName);
        admin.deleteTable(tableName);
        System.out.println(tablename + " table Exists, delete ......");
    }
    @SuppressWarnings("deprecation")
    HTableDescriptor desc = new HTableDescriptor(tableName);
    @SuppressWarnings("deprecation")
    HColumnDescriptor colDesc = new HColumnDescriptor("base_info");
    colDesc.setBloomFilterType(BloomType.ROWCOL);
    desc.addFamily(colDesc);
    desc.addFamily(new HColumnDescriptor("extra_info"));
    admin.createTable(desc);
    admin.close();
    System.out.println("create table success!");
}


  1. 插入数据
public static void addData(String tablename) throws Exception {
          HTable table = (HTable) connection.getTable(TableName.valueOf(tablename));
          Put p1 = new Put(Bytes.toBytes("0001"));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("weight"), Bytes.toBytes(String.valueOf(89)));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("caption"), Bytes.toBytes("GuoGuang"));
          p1.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("production"), Bytes.toBytes("LongKou"));
          p1.addColumn(Bytes.toBytes("extra_info"), Bytes.toBytes("grade"), Bytes.toBytes("good"));
          table.put(p1);
          Put p2 = new Put(Bytes.toBytes("0002"));
          p2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("weight"), Bytes.toBytes(String.valueOf(50)));
          p2.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("caption"), Bytes.toBytes("HongFuShi"));
          table.put(p2);
          table.close();
          System.out.print("insert successed");
          }


shell可查:

5cf6a2035482458dad17601f655f9fa6.png


  1. 浏览全部信息
    因为已知插入了两行,所以代码直接for i到2:
    此代码普适性不够高,但是适合浏览以某一个字符串开头比如"000"开头的row key或者是某一个单独的行


public static void getData(String tablename) throws IOException {
        HTable table = (HTable) connection.getTable(TableName.valueOf(tablename));
        for (int i = 1; i <= 2; i++) {
            Get get = new Get(Bytes.toBytes("000" + String.valueOf(i)));
            Result result = table.get(get);
            if (result != null && !result.isEmpty()) {
                for (Cell cell : result.listCells()) {
                    String family = Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength());
                    String key = Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength());
                    String value = Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength());
                    System.out.println(family + "  " + key + ": " + value);
                }
            }
            System.out.println("");
        }
    }


b47662740bb244d6a0528fe120f4d396.png


如果说在事先不知道有多少行的情况下,建议采用下面的方法:

public static void getAllRows(String tableName) throws IOException {
    HTable table = (HTable) connection.getTable(TableName.valueOf(tableName));
    Scan scan = new Scan();
    ResultScanner resultScanner = table.getScanner(scan);
    for(Result result : resultScanner){
      Cell[] cells = result.rawCells();
      for(Cell cell : cells) {
        System.out.println("Row Key: " + Bytes.toString(CellUtil.cloneRow(cell)));
        System.out.println("Column Family: " + Bytes.toString(CellUtil.cloneFamily(cell)));
        System.out.println("Column: " + Bytes.toString(CellUtil.cloneQualifier(cell)));
        System.out.println("Value :" + Bytes.toString(CellUtil.cloneValue(cell)) + "\n\n");
      }
    }
  }


结果如下图:

d5b0bb08c5fc45129b869748b428f280.png


2. Spark(Shell下)


首先我们可以通过:

/usr/local/hadoop/sbin/start-all.sh打开hadoop

/usr/local/spark/sbin/start-all.sh

/usr/local/spark/sbin/start-slaves.sh打开spark

然后通过命令:spark-shell进入终端进行操作

63c2e0e03a724fbc96235ff67de22ecf.png


结构化数据文件创建DataFrame

一般情况下,把结构化数据文件存储在HDFS。Spark SQL最常见的结构化数据文件格式是Parquet文件或JSON文件。Spark SQL可以通过load()方法将HDFS上的格式化文件转换为DataFrame,load默认导入的文件格式是Parquet。


①从外部数据源创建DataFrame


加入我们有一个这样的json文件:

1dcbd4dfa79f460d95f25da4d530dfd9.png


我们将它放到虚拟机的某一个确定的hdfs路径下,比如hdfs://master315:9000/person.js

取名为person.json

如果文件放到本地,会出现问题:


37494d91a3ef4feca770c810112f7739.png


是因为没有通过file://指定位置,比如:file:///home/person.json

所以要刻意注意下文件放的位置

var df=spark.read.format("json").load("/person.json")


a105afd85e5f4afdbe1ab4d00f2fa49f.png


②根据JSON数据转化为二维表


将json二维结构化出来应该是这个样子的:

name height sex
username01 170
username02 M

经过第三部之后,再来看这里,就会发现通过df.show()直接展示结果:


abe2ffbb191f454db7f38a0dfddfaf51.png


③Spark SQL


df.createTempView("Tabel1")

这里的Tabel1是表名

a9f830d55e364ec183e2c1d92fb73de3.png


df.show()

3184f014c7f0465ca619cfc4ee33a234.png


比如说查看所有信息:

spark.sql("select * from Tabel1").show()

5e9b70fbd616489490607a31d43dab01.png


展示性别为’M’的人信息:


7a50841da7d44ab494577f4b618ce1e6.png


④DataFrame基本操作


输出所有人名:

df.select(df("name")).show()

4060908fccf1494e8671e74edf4581aa.png


当然还有其它操作:

4af0f8b9b4b34ee4bc604c352948347e.png


其中name和age都是表中的字段名可以理解为和height、sex一样

24c3487ea2fd44b39b0c407d74340c74.png






相关实践学习
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
分布式计算 资源调度 Kubernetes
云计算复习索引(下)
二. Docker/分布式部署/分布式集群 1.CentOS + JDK + Tomcat制作镜像 2.k8s中部署已有镜像 三 . 云计算资源管理 1.Mesos 分布式计算资源管理框架(本身不计算) 2. Openstack
136 0
云计算复习索引(下)
|
存储 云计算 索引
云计算设计模式(十二)——索引表模式
云计算设计模式(十二)——索引表模式 创建索引过的被查询条件经常被引用的数据存储等领域。这种模式可以通过允许应用程序更快速地定位数据来从数据存储中检索提高查询性能。
827 0
|
5月前
|
云计算
电子好书发您分享《阿里云认证的解析与实战-云计算ACP认证》
电子好书发您分享《阿里云认证的解析与实战-云计算ACP认证》
63 1
|
21天前
|
存储 人工智能 文件存储
阿里云吴结生:云计算是企业实现数智化的阶梯
文章背景:阿里云副总裁、阿里云云存储产品线负责人吴结生在云栖大会的演讲中表示:“从云的角度来看,云的存力、算力,云上提供的数据管理的能力,大数据分析能力和人工智能计算能力,帮助每家企业从数据公司演进到数据驱动的公司。因此云计算是企业实现数智化的阶梯。”
|
1月前
|
弹性计算 云计算 虚拟化
GPU云服务器_GPU云计算_异构计算_弹性计算-阿里云
阿里云提供多种GPU服务器,包括NVIDIA V100、T4、A10和A100计算卡,其中gn6i实例享有最高3折优惠。包年包月价格如:gn6v实例(16G V100)从4685.20元/月起,gn6i实例(16G T4)从1878.40元/月起。学生无特定GPU服务器优惠,但新用户有折扣活动。GPU服务器计费模式有包年包月和按小时计费,按需选择。详细价格及活动规则见官方链接。
18 0
GPU云服务器_GPU云计算_异构计算_弹性计算-阿里云
|
2月前
|
弹性计算 NoSQL 数据库
电车卷?云计算更卷,阿里云领头降价,2024阿里云服务器又降价了!
电车卷?云计算更卷,阿里云领头降价,2024阿里云服务器又降价了!
|
3月前
|
云安全 架构师 安全
阿里云云计算架构师ACE认证(Alibaba Cloud Certified Expert - Cloud Architect)考试大纲
介绍阿里云云计算架构师ACE认证(Alibaba Cloud Certified Expert - Cloud Architect)所需具备的知识及学习方法等。
689 2
|
3月前
|
存储 弹性计算 数据库
阿里云云计算工程师ACA认证(Alibaba Cloud Certified Associate - Cloud Computing)考试大纲
介绍阿里云云计算工程师ACA认证(Alibaba Cloud Certified Associate - Cloud Computing)所需具备的知识及学习方法等。
676 1