为什么要使用NoSQLNOSQL的优势

为什么要使用NoSQLNOSQL的优势,第1张

非常荣幸能受邀在InfoQ开辟这样一个关于NoSQL的专栏,InfoQ是我非常尊重的一家技术媒体,同时我也希望借助InfoQ,在国内推动NoSQL的发展,希望跟我一样有兴趣的朋友加入进来。这次的NoSQL专栏系列将先整体介绍NoSQL,然后介绍如何把NoSQL运用到自己的项目中合适的场景中,还会适当地分析一些成功案例,希望有成功使用NoSQL经验的朋友给我提供一些线索和信息。NoSQL概念随着web20的快速发展,非关系型、分布式数据存储得到了快速的发展,它们不保证关系数据的ACID特性。NoSQL概念在2009年被提了出来。NoSQL最常见的解释是“non-relational”,“Not Only SQL”也被很多人接受。(“NoSQL”一词最早于1998年被用于一个轻量级的关系数据库的名字。)NoSQL被我们用得最多的当数key-value存储,当然还有其他的文档型的、列存储、图型数据库、xml数据库等。在NoSQL概念提出之前,这些数据库就被用于各种系统当中,但是却很少用于web互联网应用。比如cdb、qdbm、bdb数据库。传统关系数据库的瓶颈传统的关系数据库具有不错的性能,高稳定型,久经历史考验,而且使用简单,功能强大,同时也积累了大量的成功案例。在互联网领域,MySQL成为了绝对靠前的王者,毫不夸张的说,MySQL为互联网的发展做出了卓越的贡献。在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。在那个时候,更多的都是静态网页,动态交互类型的网站不多。到了最近10年,网站开始快速发展。火爆的论坛、博客、sns、微博逐渐引领web领域的潮流。在初期,论坛的流量其实也不大,如果你接触网络比较早,你可能还记得那个时候还有文本型存储的论坛程序,可以想象一般的论坛的流量有多大。Memcached+MySQL后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,web程序不再仅仅专注在功能上,同时也在追求性能。程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。在这个时候,Memcached就自然的成为一个非常时尚的技术产品。Memcached作为一个独立的分布式的缓存服务器,为多个web服务器提供了一个共享的高性能缓存服务,在Memcached服务器上,又发展了根据hash算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性hash来解决增加或减少缓存服务器导致重新hash带来的大量缓存失效的弊端。当时,如果你去面试,你说你有Memcached经验,肯定会加分的。Mysql主从读写分离由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。分表分库随着web20的继续高速发展,在Memcached的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但是由于在互联网几乎没有成功案例,性能也不能满足互联网的要求,只是在高可靠性上提供了非常大的保证。MySQL的扩展性瓶颈在互联网,大部分的MySQL都应该是IO密集型的,事实上,如果你的MySQL是个CPU密集型的话,那么很可能你的MySQL设计得有性能问题,需要优化了。大数据量高并发环境下的MySQL应用开发越来越复杂,也越来越具有技术挑战性。分表分库的规则把握都是需要经验的。虽然有像淘宝这样技术实力强大的公司开发了透明的中间件层来屏蔽开发者的复杂性,但是避免不了整个架构的复杂性。分库分表的子库到一定阶段又面临扩展问题。还有就是需求的变更,可能又需要一种新的分库方式。MySQL数据库也经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。NOSQL的优势易扩展NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。大数据量,高性能NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,在针对web20的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。灵活的数据模型NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的web20时代尤其明显。高可用NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。总结NoSQL数据库的出现,弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本。MySQL和NoSQL都有各自的特点和使用的应用场景,两者的紧密结合将会给web20的数据库发展带来新的思路。让关系数据库关注在关系上,NoSQL关注在存储上。

数据库有两种类型,分别是关系型数据库与非关系型数据库。

1、关系数据库

包括:MySQL、MariaDB(MySQL的代替品,英文维基百科从MySQL转向MariaDB)、Percona Server(MySQL的代替品)、PostgreSQL、Microsoft Access、Microsoft SQL Server、Google Fusion Tables。

FileMaker、Oracle数据库、Sybase、dBASE、Clipper、FoxPro、foshub。几乎所有的数据库管理系统都配备了一个开放式数据库连接(ODBC)驱动程序,令各个数据库之间得以互相集成。

2、非关系型数据库(NoSQL)

包括:BigTable(Google)、Cassandra、MongoDB、CouchDB、键值(key-value)数据库、Apache Cassandra(为Facebook所使用):高度可扩展、Dynamo、LevelDB(Google)。

扩展资料:

数据库的作用

数据库管理系统是为管理数据库而设计的电脑软件系统,一般具有存储、截取、安全保障、备份等基础功能。

数据库管理系统可以依据它所支持的数据库模型来作分类,例如关系式、XML;或依据所支持的计算机类型来作分类,例如服务器群集、移动电话。

或依据所用查询语言来作分类,例如SQL、XQuery;或依据性能冲量重点来作分类,例如最大规模、最高运行速度;亦或其他的分类方式。不论使用哪种分类方式,一些DBMS能够跨类别,例如,同时支持多种查询语言。

参考资料来源:百度百科--数据库

关系数据库存储模式是以关系模型为基础的数据库存储方式,它通过关系数据库管理系统(RDBMS)进行数据的管理。关系模型是目前商用数据库领域最流行的一种数据模型,其基本思想是用二维表表示实体及其联系。二维表中的每一列对应实体的一个属性,并给出相应的属性值,每一行形成一个有多种属性组成的多元组,或称元组(TUPPLE),与一个特定实体相对应。

采用关系数据库存储方式,其主要特点是:

(1)关系结构灵活,可满足所有用布尔逻辑运算和数学运算规则形成的查询要求。

(2)关系数据还能搜索、组合和比较不同类型的数据,加入和删除数据都很方便。

(3)其缺点是由于许多 *** 作都要求在文件中顺序查找满足条件特定关系的数据,如果数据库较大,这一查找过程要花费很多时间。

在早期的土地信息系统的建设中,一般采用关系型数据库来存储管理属性数据,而空间数据的管理多采用文件的方式来组织管理。主要原因一是因为关系型数据库对地理空间数据的表达能力不足;二是因为地理信息系统软件中一些数据模型和数据文件的结合很紧密。

随着数据库技术的发展和地理信息系统技术的广泛应用,基于关系对象数据库的空间数据管理技术日渐成熟,出现了商用的统一存储空间数据和属性数据的软件系统,如Oracle数据库系统产品Oracle Spatial支持对空间数据的存储与管理,使用Esri的Arc SDE可用关系型数据库(RDBMS)管理空间数据。

2010年9月全国计算机二级C语言笔试试题:文字版

一、选择题(每小题2分,共70分)

下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的。请将正确选项填涂在答题卡相应位置上,答在试卷上不得分。

(1)下列叙述中正确的是

A)线性表的链式存储结构与顺序存储结构所需要的存储空间是相同的

B)线性表的链式存储结构所需要的存储空间一般要多于顺序存储结构

C)线性表的链式存储结构所需要的存储空间一般要少于顺序存储结构

D)上述三种说法都不对

(2)下列叙述中正确的是

A)在栈中,栈中元素随栈底指针与栈顶指针的变化而动态变化

B)在栈中,栈顶指针不变,栈中元素随栈底指针的变化而动态变化

C)在栈中,栈底指针不变,栈中元素随栈顶指针的变化而动态变化

D)上述三种说法都不对

(3)软件测试的目的是

A)评估软件可靠性

B)发现并改正程序中的错误

C)改正程序中的错误

D)发现程序中的错误

(4)下面描述中,不属于软件危机表现的是

A)软件过程不规范

B)软件开发生产率低

C)软件质量难以控制

D)软件成本不断提高

(5)软件生命周期是指

A)软件产品从提出、实现、使用维护到停止使用退役的过程

B)软件从需求分析、设计、实现到测试完成的过程

C)软件的开发过程

D)软件的运行维护过程

(6)面向对象方法中,继承是指

A)一组对象所具有的相似性质

B)一个对象具有另一个对象的性质

C)各对象之间的共同性质

D)类之间共享属性和 *** 作的机制

(7)层次型、网状型和关系型数据库划分原则是

A)记录长度

B)文件的大小

C)联系的复杂程度

D)数据之间的****

(8)一个工作人员可以使用多台计算机,而一台计算机可被多个人使用,则实体工作人员、与实体计算机之间的联系是

A)一对一

B)一对多

C)多对多

D)多对一

(9)数据库设计中反映用户对数据要求的模式是

A)内模式

B)概念模式

C)外模式

D)设计模式

(10)有三个关系R、S和T如下:

则由关系R和S得到关系T的 *** 作是

A)自然连接

B)交

C)投影

D)并

(11)以下关于结构化程序设计的叙述中正确的是

A)一个结构化程序必须同时由顺序、分支、循环三种结构组成

B)结构化程序使用goto语句会很便捷

C)在C语言中,程序的模块化是利用函数实现的

D)由三种基本结构构成的程序只能解决小规模的问题

(12)以下关于简单程序设计的步骤和顺序的说法中正确的是

A)确定算法后,整理并写出文档,最后进行编码和上机调试

B)首先确定数据结构,然后确定算法,再编码,并上机调试,最后整理文档

C)先编码和上机调试,在编码过程中确定算法和数据结构,最后整理文档

D)先写好文档,再根据文档进行编码和上机调试,最后确定算法和数据结构

(13)以下叙述中错误的是

A) C程序在运行过程中所有计算都以二进制方式进行

B)C程序在运行过程中所有计算都以十进制方式进行

C)所有C程序都需要编译链接无误后才能运行

D)C程序中整型变量只能存放整数,实型变量只能存放浮点数

(14)有以下定义:int a; long b; double x,y;则以下选项中正确的表达式是

A)a%(int)(x-y)

B)a=x!=y;

C)(ay)%b

D)y=x+y=x

(15)以下选项中能表示合法常量的是

A)整数:1,200

B)实数:15E20

C )字符斜杠:‘\’

D)字符串:"\007"

(16)表达式a+=a-=a=9的值是

A)9

B)_9

C)18

D)0

(17)若变量已正确定义,在if (W)printf(“%d\n,k”);中,以下不可替代W的是

A)a<>b+c

B)ch=getchar()

C)a==b+c

D)a++

(18)有以下程序

#include<stdioh>

main()

{int a=1,b=0;

if(!a) b++;

else if(a==0)if(a)b+=2;

else b+=3;

printf(”%d\n”,b);

程序运行后的输出结果是

A)0

B)1

C)2

D)3

(19)若有定义语句int a, b;double x;则下列选项中没有错误的是

A)switch(x%2) B)switch((int)x/20

{case 0: a++; break; {case 0: a++; break;

case 1: b++; break; case 1: b++; break;

default : a++; b++; default : a++; b++;

} }

C)switch((int)x%2) D)switch((int)(x)%2)

{case 0: a++; break; {case 00: a++; break;

case 1: b++; break; case 10: b++; break;

default : a++; b++; default : a++; b++;

} }

(20)有以下程序

#include <stdioh>

main()

{int a=1,b=2;

while(a<6){b+=a;a+=2;b%二10;}

printf(”%d,%d\n”,a,b);

程序运行后的输出结果是

A)5,11

B)7,1

C)7,11

D)6,1

(21)有以下程序

#include<stdio.h>

main()

{int y=10;

while(y--);

printf(”Y=%d\n”,Y);

程序执行后的输出结果是

A)y=0

B)y= -1

C)y=1

D)while构成无限循环

(22)有以下程序

#include<stdio h>

main()

{char s〔」=”rstuv";

printf(”%c\n”,s+2);

程序运行后的输出结果是

A)tuv

B)字符t的ASCII码值

C)t

D)出错

(23)有以下程序

#include<stdioh>

#include<stringh>

main()

{char x〔〕=”STRING”;

x〔0」=0;x〔1〕=’\0’;x〔2」=’0’;

printf(”%d %d\n”,sizeof(x),strlen(x));

程序运行后的输出结果是

A)6 1

B)7 0

C)6 3

D)7 1

(24)有以下程序

#include<stdio.h>

Int f(int x);

main()

{int n=1,m;

m=f(f(f(n)));printf(”%d\n”,m);

int f(int x)

{return x2;}

程序运行后的输出结果是

A)1

B)2

C)4

D)8

(25)以下程序段完全正确的是

A)int p; scanf("%d",&p);

B)int p; scanf(“%d”,p);

C)int k, p=&k; scanf("%d",p);

D)int k, p:; p= &k; scanf(“%d”,p);

(26)有定义语句:int p[4];以下选项中与此语句等价的是

A)int p[4];

B)int p;

C)int (p「4」);

D)int (p)「4」;

(27)下列定义数组的语句中,正确的是

A)int N=10; B)#define N 10

int x[N]; int x[N];

C)int x[010〕; D)int x〔〕;

(28)若要定义一个具有5个元素的整型数组,以下错误的定义语句是

A)int a[5]={0};

B)int b[]={0,0,0,0,0};

C)int c[2+3];

D)int i=5,d[i];

(29)有以下程序

#include<stdio.h>

void f(int p);

main()

{int a〔5〕={1,2,3,4,5},r=a;

f(r);printf(”%d\n”;*r);

void f(int p)

{p=p+3;printf(”%d,”,p);}

程序运行后的输出结果是

A)1,4

B)4,4

C)3,1

D)4,1

(30)有以下程序(函数fun只对下标为偶数的元素进行 *** 作)

# include<stdio.h>

void fun(int*a;int n)

{int i、j、k、t;

for (i=0;i<n一1;1+=2)

{k=i;‘

for(j=i;j<n;j+=2)if(a〔j〕>a〔k])k=j;

t=a〔i];a〔i]=a〔k];a〔k]=t;

main()

{int aa「10」={1、2、3、4、5、6、7},i;

fun(aa、7);

for(i=0,i<7; i++)printf(”%d,”,aa〔i〕));

printf(”\n”);

程序运行后的输出结果是

A)7,2,5,4,3,6,1

B)1,6,3,4,5,2,7

C)7,6,5,4,3,2,1

D)1,7,3,5,6;2,1

(31)下列选项中,能够满足“若字符串s1等于字符串s2,则执行ST"要求的是

A)if(strcmp(s2,s1)==0)ST;

B)if(sl==s2)ST;

C)if(strcpy(s l ,s2)==1)ST;

D)if(sl-s2==0)ST;

(32)以下不能将s所指字符串正确复制到t所指存储空间的是

A)while(t=s){t++;s++;}

B)for(i=0;t[i]=s[i〕;i++);

C)do{t++=s++;}while(*s);

D)for(i=0,j=0;t[i++]=s[j++];);

(33)有以下程序( strcat函数用以连接两个字符串)

#include<stdio.h>

#include<string .h>

main()

{char a〔20〕=”ABCD\OEFG\0”,b〔〕=”IJK”;

strcat(a,b);printf(”%s\n”,a);

程序运行后的输出结果是

A)ABCDE\OFG\OIJK

B)ABCDIJK

C)IJK

D)EFGIJK

(34)有以下程序,程序中库函数islower (ch)用以判断ch中的字母是否为小写字母

#include<stdio.h>

#include<ctype.h>

void fun(char*p)

{int i=0;

while (p[i〕)

{if(p[i]==’ ’&& islower(p「i-1」))p[i-1]=p[i-1]-‘a’+‘A’;

i++;

main()

{char s1〔100〕=”ab cd EFG!”;

fun(s1); printf(”%s\n”,s1);

程序运行后的输出结果是

A)ab cd EFG!

B)Ab Cd EFg!

C)aB cD EFG!

D)ab cd EFg!

(35)有以下程序

#include<stdio.h>

void fun(int x)

{if(x/2>1)fun(x/2);

printf(”%d”,x);

main()

{fun(7);printf(”\n”);}

程序运行后的输出结果是

A)1 3 7

B)7 3 1

C)7 3

D)3 7

(36)有以下程序

#include<stdio.h>

int fun()

{static int x=1;

x+=1;return x;

main()

{int i;s=1;

for(i=1;i<=5;i++)s+=fun();

printf(”%d\n”,s);

程序运行后的输出结果是

A)11

B)21

C)6

D)120

(37)有以下程序

#inctude<stdio.h>

#include<stdlib.h>

Main()

{int a,b,*c;

a=b=c=(int*)malloc(sizeof(int));

*a=1;*b=2,*c=3;

a=b;

printf(“%d,%d,%d\n”,*a,*b,*c);

程序运行后的输出结果是

A)3,3,3 B)2,2,3 C)1,2,3 D)1,1,3

(38)有以下程序

#include<stdio.h>

main()

{int s,t,A=10;double B=6;

s=sizeof(A);t=sizeof(B);

printf(“%d,%d\n”,s,t);

在VC6平台上编译运行,程序运行后的输出结果是

A)2,4 B)4,4 C)4,8 D)10,6

(39)若有以下语句

Typedef struct S

{int g; char h;}T;

以下叙述中正确的是

A)可用S定义结构体变量

B)可用T定义结构体变量

C)S是struct类型的变量

D)T是struct S类型的变量

(40)有以下程序

#include<stdio.h>

main()

{short c=124;

c=c_______;

printf(“%d\n”、C);

若要使程序的运行结果为248,应在下划线处填入的是

A)>>2 B)|248 C)&0248 D)<<I

二、填空题(每空2分,共30分)

请将每空的正确答案写在答题卡1至15序号的横线上,答在试卷上不得分。

(1)一个栈的初始状态为空。首先将元素5,4,3,2,1依次入栈,然后退栈一次,再将元素 A,B,C,D依次入栈,之后将所有元素全部退栈,则所有元素退栈(包括中间退栈的元素)的顺序为1

(2)在长度为n的线性表中,寻找最大项至少需要比较2次。

(3)一棵二叉树有10个度为1的结点,7个度为2的结点,则该二叉树共有3个结点。

(4)仅由顺序、选择(分支)和重复(循环)结构构成的程序是4程序。

(5)数据库设计的四个阶段是:需求分析,概念设计,逻辑设计5。

(6)以下程序运行后的输出结果是6。

#include<stdio.h>

main()

{int a=200,b=010;

printf(”%d%d\n”,a,b);

(7)有以下程序

#include<stdio.h>

main()

{int x,Y;

scanf(”%2d%ld”,&x,&y);printf(”%d\n”,x+y);

程序运行时输入:1234567程序的运行结果是7。

(8)在C语言中,当表达式值为0时表示逻辑值“假”,当表达式值为8时表示逻辑值“真”。

(9)有以下程序

#include<stdio.h>

main()

{int i,n[]={0,0,0,0,0};

for (i=1;i<=4;i++)

{n[i]=n[i-1]*3+1; printf(”%d ",n[i]);}

}

程序运行后的输出结果是9。

(10)以下fun函数的功能是:找出具有N个元素的一维数组中的最小值,并作为函数值返回。请填空。(设N已定义)

int fun(int x〔N〕)

{int i,k=0;

for(i=0;i<N;I++)

if(x〔i〕

return x〔k〕;

}

(11)有以下程序

#include<stdio.h>

int*f(int p,int*q);

main()

{int m=1,n=2,*r=&m;

r=f(r,&n);printf(”%d\n”,*r);

int*f(int p,int*q)

{return(p>*q)p:q;}

程序运行后的输出结果是11

(12)以下fun函数的功能是在N行M列的整形二维数组中,选出一个最大值作为函数值返回,请填空。(设M, N已定义)

int fun(int a〔N〕[M))

{int i,j,row=0,col=0;

for(i=0;i<N;I++)

for(j=0;j

if(a〔i〕〔j〕>a〔row〕〔col〕){row=i;col=j;}

return(12):

}

(13)有以下程序

#include<stdio.h>

main()

{int n[2],i,j;

for(i=0;i<2;i++)n[i]=0;

for(i=0;i<2;i++)

for(j=0;j<2;j++)n〔j〕=n「i」+1;

printf(”%d\n”,n[1]);

程序运行后的输出结果是13

(14)以下程序的功能是:借助指针变量找出数组元素中最大值所在的位置并输出该最大值。请在输出语句中填写代表最大值的输出项。

#include<stdio.h>

main()

{int a〔10〕,p,*s;

for(p=a;p-a<10;p++)scanf(”%d”,p);

for(p=a,s=a;p-a<10;p++)if(p>s)S=P;

printf("max=%d\n”,14);

(15)以下程序打开新文件ftxt,并调用字符输出函数将a数组中的字符写入其中,请填空。

#include<stdio.h>

main()

{15fp;

char a〔5〕={’1’,’2’,’3’,’4’,’5’},i;

fp=fopen(”f .txt”,”w”);

for(i=0;i<5;i++)fputc(a[i],fp);

fclose(fp);

Hive 存储格式和关系型数据库之间进行导入导出

最近更新时间:2020-09-29 15:54:18

前往 GitHub 编辑

我的收藏

本页目录:

1 开发准备

2 将关系型数据库导入到 Hive 中

3 将 Hive 导入到关系型数据库中

使用 HDFS 中的 Hive 数据

使用 Hcatalog 进行导入

4 将 orc 格式的 Hive 表格导入到关系型数据库中

本文介绍了使用腾讯云 Sqoop 服务将数据在 MySQL 和 Hive 之间相互导入导出的方法。

1 开发准备

确认已开通腾讯云,并且创建了一个 EMR 集群。在创建 EMR 集群的时候需要在软件配置界面选择 Sqoop,Hive 组件。

Sqoop 等相关软件安装在路径 EMR 云服务器的/usr/local/service/路径下。

2 将关系型数据库导入到 Hive 中

本节将继续使用上一节的用例。

进入 EMR 控制台,复制目标集群的实例 ID,即集群的名字。再进入关系型数据库控制台,使用 Ctrl+F 进行搜索,找到集群对应的 MySQL 数据库,查看该数据库的内网地址 $mysqlIP。

登录 EMR 集群中的任意机器,最好是登录到 Master 节点。登录 EMR 的方式请参考 登录 Linux 实例。这里我们可以选择使用 WebShell 登录。单击对应云服务器右侧的登录,进入登录界面,用户名默认为 root,密码为创建 EMR 时用户自己输入的密码。输入正确后,即可进入命令行界面。

在 EMR 命令行先使用以下指令切换到 Hadoop 用户,并进入 Hive 文件夹:

[root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive

新建一个 Hive 数据库:

[hadoop@172 hive]$ hive

hive> create database hive_from_sqoop;

OK

Time taken: 0167 seconds

使用 sqoop-import 命令把上一节中创建的 MySQL 数据库导入到 Hive 中:

[hadoop@172 hive]# cd /usr/local/service/sqoop

[hadoop@172 sqoop]$ bin/sqoop-import --connect  jdbc:mysql://$mysqlIP/test --username root -P --table sqoop_test_back --hive-database hive_from_sqoop --hive-import --hive-table hive_from_sqoop

$mysqlIP:腾讯云关系型数据库(CDB)的内网地址。

test:MySQL 数据库名称。

--table:要导出的 MySQL 表名。

--hive-database:Hive 数据库名。

--hive-table:导入的 Hive 表名。

执行指令需要输入您的 MySQL 密码,默认为您创建 EMR 集群时设置的密码。执行成功后,可以在 Hive 中查看导入的数据库:

hive> select from hive_from_sqoop;OK1    first    2018-07-03 16:07:460    spark2    second    2018-07-03 15:30:570    mr3    third    2018-07-03 15:31:070    yarn4    forth    2018-07-03 15:39:380    hbase5    fifth    2018-07-03 16:02:290    hive6    sixth    2018-07-03 16:09:580    sqoopTime taken: 1245 seconds, Fetched: 6 row(s)

3 将 Hive 导入到关系型数据库中

Sqoop 支持将 Hive 表中的数据导入到关系型数据库中。先在 Hive 中创建新表并导入数据。

登录 EMR 集群中的任意机器,最好是登录到 Master 节点。在 EMR 命令行先使用以下指令切换到 Hadoop 用户,并进入 Hive 文件夹:

[root@172 ~]# su hadoop[hadoop@172 ~]# cd /usr/local/service/hive

新建一个 bash 脚本文件 gen_datash,在其中添加以下代码:

#!/bin/bashMAXROW=1000000 #指定生成数据行数for((i = 0; i < $MAXROW; i++))do echo $RANDOM, \"$RANDOM\"done

并按如下方式执行:

[hadoop@172 hive]$ /gen_datash > hive_testdata

这个脚本文件会生成1,000,000个随机数对,并且保存到文件 hive_testdata 中。

使用如下指令把生成的测试数据先上传到 HDFS 中:

[hadoop@172 hive]$ hdfs dfs -put /hive_testdata /$hdfspath

其中 $hdfspath 为 HDFS 上的您存放文件的路径。

连接 Hive 并创建测试表:

[hadoop@172 hive]$ bin/hivehive> create database hive_to_sqoop;          #创建数据库 hive_to_sqoopOK

Time taken: 0176 secondshive> use hive_to_sqoop;                            #切换数据库OK

Time taken: 0176 secondshive> create table hive_test (a int, b string)hive> ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';#创建数据表 hive_test, 并指定列分割符为’,’

OK

Time taken: 0204 secondshive> load data inpath "/$hdfspath/hive_testdata" into table hive_test;   #导入数据

$hdfspath 为 HDFS 上的您存放文件的路径。

成功后可使用quit命令退出 Hive 数据仓库。连接关系型数据库并创建对应的表格:

[hadoop@172 hive]$ mysql -h $mysqlIP –p

Enter password:

其中 $mysqlIP 为该数据库的内网地址,密码为您创建集群时设置的密码。

在 MySQL 中创建一个名为 test 的表格,MySQL 中的表字段名字和 Hive 中的表字段名字必须完全一致:

mysql> create table table_from_hive (a int,b varchar(255));

成功创建表格后即可退出 MySQL。

使用 Sqoop 把 Hive 数据仓库中的数据导入到关系型数据库中有两种方法,可以直接使用 HDFS 存储的 Hive 数据,也可以使用 Hcatalog 来进行数据的导入。

使用 HDFS 中的 Hive 数据

切换进入 Sqoop 文件夹,然后使用以下指令把 Hive 数据库中的数据导出到关系型数据库中:

[hadoop@172 hive]$ cd  /sqoop/bin

[hadoop@172 bin]$ /sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P

--table table_from_hive --export-dir /usr/hive/warehouse/hive_to_sqoopdb/hive_test

其中 $mysqlIP 为您的关系型数据库的内网 IP 地址,test 为关系型数据库中的数据库名,--table 后跟的参数为您的关系型数据库的表名,--export-dir 后跟的参数为 Hive 表中的数据在 HDFS 中存储的位置。

使用 Hcatalog 进行导入

切换进入 Sqoop 文件夹,然后使用以下指令把 Hive 数据库中的数据导出到关系型数据库中:

[hadoop@172 hive]$ cd  /sqoop/bin

[hadoop@172 bin]$ /sqoop-export --connect jdbc:mysql://$mysqlIP/test --username root -P

--table table_from_hive --hcatalog-database hive_to_sqoop --hcatalog-table hive_test

其中 $mysqlIP 为您的关系型数据库的内网 IP 地址,test 为关系型数据库中的数据库名,--table 后跟的参数为您的关系型数据库的表名,--hcatalog-database 后面跟的参数是要导出的 Hive 表所在的数据库的名称,--hcatalog-table 后面跟的参数是要 Hive 中要导出的表的名称。

*** 作完成后可以进入关系型数据库查看是否导入成功:

[hadoop@172 hive]$ mysql -h $mysqlIP –p                  #连接 MySQLEnter password:mysql> use test;

Database changed

mysql> select count() from table_from_hive;     #现在表中有1000000条数据+----------+| count() |+----------+| 1000000 |+----------+1 row in set (003 sec)

mysql> select from table_from_hive limit 10;    #查看表中前10条记录+-------+----------+| a     | b        |

+-------+----------+

| 28523 |  "3394"  || 31065 |  "24583" |

|   399 |  "23629" || 18779 |  "8377"  |

| 25376 |  "30798" || 20234 |  "22048" |

| 30744 |  "32753" || 21423 |  "6117"  |

| 26867 |  "16787" || 18526 |  "5856"  |

+-------+----------+

10 rows in set (000 sec)

更多关于 sqoop-export 命令的参数可以通过如下命令查看:

[hadoop@172 bin]$ /sqoop-export --help

4 将 orc 格式的 Hive 表格导入到关系型数据库中

数据库有两种类型,分别是关系型数据库与非关系型数据库。

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、截取、更新、删除等 *** 作。

关系型数据库主要有:

Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等等。

非关系型数据库主要有:

NoSql、Cloudant、MongoDb、redis、HBase等等。

扩展资料

非关系型数据库的优势:

1、性能高:NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。

2、可扩展性好:同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

关系型数据库的优势:

1、可以复杂查询:可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

2、事务支持良好:使得对于安全性能很高的数据访问要求得以实现。

参考资料来源:百度百科-数据库

以上就是关于为什么要使用NoSQLNOSQL的优势全部的内容,包括:为什么要使用NoSQLNOSQL的优势、数据库有哪几种、什么是关系数据库存储模式等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9803141.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存