精华内容
下载资源
问答
  • 下表0
    万次阅读 多人点赞
    2020-04-16 16:59:53

    共阳极:

    位选为高电平(即1)选中数码管,

    各段选为低电平(即0接地时)选中各数码段。

    uchar code table[]={
    	0xc0//0
    	0xf9//1
    	0xa4//2
    	0xb0//3
    	0x99//4
    	0x92//5
    	0x82//6
    	0xf8//7
    	0x80//8
    	0x90//9
    	0x88//A
    	0x83//B
    	0xc6//C
    	0xa1//D
    	0x86//E
    	0x8e, //F
    	0x8c, //P
    	0xc1,//U
    	0x91,//Y
    	0x7c,//L
    	0x00,//全亮
    	0xff  //熄灭
    };
    

    共阴极:
    位选为低电平(即0)选中数码管,

    各段选为高电平(即1接+5V时)选中各数码段。

    uchar code leddata[]={
    	0x3F,  //"0"
        0x06,  //"1"
        0x5B,  //"2"
        0x4F,  //"3"
        0x66,  //"4"
        0x6D,  //"5"
        0x7D,  //"6"
        0x07,  //"7"
        0x7F,  //"8"
        0x6F,  //"9"
        0x77,  //"A"
        0x7C,  //"B"
        0x39,  //"C"
        0x5E,  //"D"
        0x79,  //"E"
        0x71,  //"F"
        0x76,  //"H"
        0x38,  //"L"
        0x37,  //"n"
        0x3E,  //"u"
        0x73,  //"P"
        0x5C,  //"o"
        0x40,  //"-"
        0x00  //熄灭
    	};
    
    
    更多相关内容
  • LR(0)分析的构建

    万次阅读 多人点赞 2019-05-31 22:56:50
    LR(0)分析的构建

    LR(0)分析表的构建

    一、实验要求

    构建LR(0)分析表
    例:
    G[E]:
    E->aA
    E->bB
    A->cA
    A->d
    B->cB
    B->d

    二、实验原理

    在网上找了好久,发现大多数都是概念和复杂公式,
    因此为了使大家能够更好的理解LR(0)分析表的构建,我准备举一个例子进行详细解析,一步步进行分析,直到最后画出分析表。
    文法:
    E->aA
    E->bB
    A->cA
    A->d
    B->cB
    B->d

    1. 给初始符再构建一个初始符E’->E(I0)
    2. 为该初始符加上 . . .,变成E’->.E
    3. 查看小圆点后字符是否为非终结符,是,将左部为该非终结符的文法加入其中,并为其添加小圆点;反之进行下一步。(I0变成E’->.E E->.aA E->.bB)
    4. 对I项目中的文法进行分析,若小圆点在最后,则不做处理;若小圆点不在最后,则将根据每个文法的小圆点后的字符来开辟出新的I项目,该文法为新项目的首句文法(I0的文法进行开辟,I0不变,生成I1、I2和I3,I1:E’>.E I2:E->.aA I3:E->.bB),然后将新开辟项目的文法小圆点向后移一位(I1:E’>E. I2:E->a.A I3:E->b.B)。注:若开辟的项目和重复,则不进行开辟,再次利用已存在的项目)
    5. 对开辟的项目重复3-4步骤,直到不再有项目开辟
      具体结果请见下图

    在这里插入图片描述

    6.然后根据上图,构建出相应的分析表
    在这里插入图片描述

    三、算法设计

    1. 设计字符串存储文法,采用结构体存储生成的项目以及项目的去向
    2. 为项目0赋予新的初始符,并添加小圆点
    3. 判断小圆点后的字符:
      若为终结符,进行下一步;若为非终结符,将该非终结符为左部的文法加入该项目当中,并为其添加小圆点。
    4. 判断小圆点位置:
      若在该句文法最后,则进行下一步;反之,开辟新的项目,该句文法为新项目的首句文法,并将新项目文法的小圆点后移一位
      注:若开辟的项目中文法和已有的项目重复,则该文法不进行开辟,再次利用已存在的项目。
    5. 重复执行3-4,直到不再有新的空间开辟出来。

    四、模块设计

    1. 变量定义
    char str[10][10];//存储文法 
    int n;//存储文法行数 
    int v=0;//存储生成项的个数 
    char r[20][10];//存储分析表的float值 
    int rr[20][10];//存储分析表的int值 
    struct DFA{
    	int num;//记录生成项的序号 
    	int  c[10];//存储该项目各个文法的去向(子代) 
    	int f;//记录该项目的来源(父代) 
    	char ss[10][10];//存储该项的文法 
    	int count;//记录该项的文法行数 
    	int l;//存储第一行字符串'.'的位置 
    }LR[20];
    
    1. 输入模块
      从键盘输入上下文无关文法,存储到char类型的字符串数组当中
    //初始化,输入上下文无关文法,以#号结尾 
    void Init(){
    	int i,j;
    	cout<<"输入上下文无关文法:"<<endl;
    	for(i=1;;i++){
    		cin>>str[i];
    		if(str[i][0]=='#')
    		break;
    	}
    	strcat(str[0],"Z->");
    	str[0][3]=str[1][0]; 
    	n=i+1;
    }
    

    我在源代码里还附录了一个输入模块的代码,因为那个是直接将文法输入到字符串中,这样就可减少在进行测试时重复输入文法的时间。
    即:

    //在一开始编程时可先给定文法,避免每次测试重复输入 
    void input(){
    	int i,j;
    	strcat(str[0],"Z->E");
    	strcat(str[1],"E->aA");
    	strcat(str[2],"E->bB");
    	strcat(str[3],"A->cA");
    	strcat(str[4],"A->d");
    	strcat(str[5],"B->cB");
    	strcat(str[6],"B->d");
    	n=7;
    	for(i=0;i<n;i++)
    	cout<<str[i]<<endl;
    	cout<<"***************************"<<endl;
    }
    
    1. LR(0)规范集构建模块
      进行算法分析中第2、3、4三步,记住几个关键点,小圆点位置、小圆点后的字符、项目的开辟(递归)
      当中为使测试方便,调用了几个子函数
      以下只附录子函数代码,具体请看最后源代码
      设置小圆点位置

    2. 输出模块
      将生成的项目以分析表的形式得出,因水品有限,采用的是cout结合二维数组进行输出,代码较多,主要是为了使得输出的格式更加的整齐。
      这部分就不重复贴出代码,大家请从源代码里查看。

    • 设置小圆点位置
    //为文法添加小数点 
    void AddD(int a,int b){//为LR[a]的ss第b行字符串添加'.' 
    	int i,j=0;
    	char c[10];
    	for(i=0;i<3;i++)
    	c[j++]=LR[a].ss[b][i];
    	c[3]='.';
    	j++;
    	for(i=3;i<strlen(LR[a].ss[b]);i++)
    	c[j++]=LR[a].ss[b][i];
    	memset(LR[a].ss[b],0,sizeof(LR[a].ss[b]));
    	for(i=0;i<j;i++)
    	LR[a].ss[b][i]=c[i];
    }
    
    • 添加移进项目的文法
    //添加移进项目的文法 
    void AddG(int a,char s){//把str文法中左部非终结符与s相同的文法,添加进LR[a]中 
    	int i,j,k;
    	for(i=0;i<n;i++){
    		if(str[i][0]==s){
    			for(j=0;j<strlen(str[i]);j++)
    			LR[a].ss[LR[a].count][j]=str[i][j];
    			AddD(a,LR[a].count); 
    			LR[a].count++;
    		}
    	}
    }
    
    • 小圆点后移一位
    //将文法小圆点向后移一位 
    void add(int a,int j){
    	int i,k;
    	char temp;
    	for(i=0;i<strlen(LR[a].ss[j]);i++){
    		LR[v].ss[0][i]=LR[a].ss[j][i];
    		if(LR[a].ss[j][i]=='.')
    		k=i;//记录小圆点的位置 
    	}
    	LR[a].c[j]=v;//记录该条文法的跳转(子)项数 
    	LR[v].f=a;//记录跳转项数的来源(父代) 
    	LR[v].count++;
    	temp=LR[v].ss[0][k+1];//小圆点向后移一位 
    	LR[v].ss[0][k+1]=LR[v].ss[0][k];
    	LR[v].ss[0][k]=temp;
    	LR[v].l=k+1;//记录小圆点的位置 
    }
    
    • 更新项目的上一项(父代)和下一项(子代)
    //更新某一项的来源(父代)和每一句文法的跳转项(子代) 
    void fix(int a,int b){
    	int i,j,k;
    	k=LR[b].f;//父代 
    	for(i=0;i<LR[k].count;i++)
    	if(LR[k].c[i]==b)
    	LR[k].c[i]=a;//子代 
    }
    
    • 删除相同的项目
    //比较,删除相同的内容 
    void Compare(int a){
    	int i,j,k;
    	for(i=0;i<a;i++){
    		for(j=i+1;j<=a;j++){
    			if(strcmp(LR[i].ss[0],LR[j].ss[0])==0){//若相同 
    				fix(i,j);
    				memset(LR[j].ss,0,sizeof(LR[j].ss));//靠后的文法内容清空 
    				LR[j].count=0;
    			}
    		}
    	}	
    }
    
    1. 主函数
    //主函数 
    int main(){
    	Init();;//输入上下文无关文法 
    	//input();//输入上下文无关文法 
    	gfj();//规范集的构建 
        Output();//输出分析表 
    } 
    

    5、结果展示

    1. 首先编译运行
      在这里插入图片描述
    2. 然后输入上下文无关文法,以#键结尾
      在这里插入图片描述

    3.然后回车获得结果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6、源代码

    源代码已经过编译,可直接使用。代码都有详细的注释,大家碰到任何问题都可以留言,一起讨论。

    #include<iostream>
    #include<iomanip>
    #include<string.h>
    using namespace std;
    
    char str[10][10];//存储文法 
    int n;//存储文法行数 
    int v=0;//存储生成项的个数 
    char r[20][10];//存储分析表的float值 
    int rr[20][10];//存储分析表的int值 
    struct DFA{
    	int num;//记录生成项的序号 
    	int  c[10];//存储该项的上一项位置 
    	int f;//记录 
    	char ss[10][10];//存储该项的文法 
    	int count;//记录该项的文法行数 
    	int l;//存储第一行字符串'.'的位置 
    }LR[20];
    
    //初始化,输入上下文无关文法,以#号结尾 
    void Init(){
    	int i,j;
    	cout<<"输入上下文无关文法:"<<endl;
    	for(i=1;;i++){
    		cin>>str[i];
    		if(str[i][0]=='#')
    		break;
    	}
    	strcat(str[0],"Z->");
    	str[0][3]=str[1][0]; 
    	n=i+1;
    }
    
    //在一开始编程时可先给定文法,避免每次测试重复输入 
    void input(){
    	int i,j;
    	strcat(str[0],"Z->E");
    	strcat(str[1],"E->aA");
    	strcat(str[2],"E->bB");
    	strcat(str[3],"A->cA");
    	strcat(str[4],"A->d");
    	strcat(str[5],"B->cB");
    	strcat(str[6],"B->d");
    	n=7;
    	for(i=0;i<n;i++)
    	cout<<str[i]<<endl;
    	cout<<"***************************"<<endl;
    }
    
    //为文法添加小数点 
    void AddD(int a,int b){//为LR[a]的ss第b行字符串添加'.' 
    	int i,j=0;
    	char c[10];
    	for(i=0;i<3;i++)
    	c[j++]=LR[a].ss[b][i];
    	c[3]='.';
    	j++;
    	for(i=3;i<strlen(LR[a].ss[b]);i++)
    	c[j++]=LR[a].ss[b][i];
    	memset(LR[a].ss[b],0,sizeof(LR[a].ss[b]));
    	for(i=0;i<j;i++)
    	LR[a].ss[b][i]=c[i];
    }
    
    //添加移进项目的文法 
    void AddG(int a,char s){//把str文法中左部非终结符与s相同的文法,添加进LR[a]中 
    	int i,j,k;
    	for(i=0;i<n;i++){
    		if(str[i][0]==s){
    			for(j=0;j<strlen(str[i]);j++)
    			LR[a].ss[LR[a].count][j]=str[i][j];
    			AddD(a,LR[a].count); 
    			LR[a].count++;
    		}
    	}
    }
    
    //将文法小圆点向后移一位 
    void add(int a,int j){
    	int i,k;
    	char temp;
    	for(i=0;i<strlen(LR[a].ss[j]);i++){
    		LR[v].ss[0][i]=LR[a].ss[j][i];
    		if(LR[a].ss[j][i]=='.')
    		k=i;//记录小圆点的位置 
    	}
    	LR[a].c[j]=v;//记录该条文法的跳转(子)项数 
    	LR[v].f=a;//记录跳转项数的来源(父代) 
    	LR[v].count++;
    	temp=LR[v].ss[0][k+1];//小圆点向后移一位 
    	LR[v].ss[0][k+1]=LR[v].ss[0][k];
    	LR[v].ss[0][k]=temp;
    	LR[v].l=k+1;//记录小圆点的位置 
    }
    
    //更新某一项的来源(父代)和每一句文法的跳转项(子代) 
    void fix(int a,int b){
    	int i,j,k;
    	k=LR[b].f;//父代 
    	for(i=0;i<LR[k].count;i++)
    	if(LR[k].c[i]==b)
    	LR[k].c[i]=a;//子代 
    }
    
    //比较,删除相同的内容 
    void Compare(int a){
    	int i,j,k;
    	for(i=0;i<a;i++){
    		for(j=i+1;j<=a;j++){
    			if(strcmp(LR[i].ss[0],LR[j].ss[0])==0){//若相同 
    				fix(i,j);
    				memset(LR[j].ss,0,sizeof(LR[j].ss));//靠后的文法内容清空 
    				LR[j].count=0;
    			}
    		}
    	}	
    }
    
    //LR(0)规范集的构建
    void gfj(){
    	int i,j,k,p;
    	for(i=0;i<20;i++){
    		LR[i].num=i;//Ii
    		if(i==0){//第一个,赋予文法的初始符Z->E 
    			for(k=0;k<strlen(str[0]);k++)
    			LR[0].ss[0][k]=str[0][k];
    			AddD(0,LR[0].count);//添加小圆点 Z->.E 
    			LR[0].l=3;//小圆点的位置 
    			LR[0].count++;//文法数目+1		
    	    	if(LR[i].ss[0][4]>='A'&&LR[i].ss[0][4]<'Z') 
    	    	AddG(i,LR[i].ss[0][4]);//添加移进项目的文法E->aA E->bB
    	    	v++;
                //为每一个文法进行向外扩散 I1、I2、I3 
    	    	for(j=0;j<LR[0].count;j++){
    	    		p=strlen(LR[0].ss[j]);
    		    	if(LR[0].ss[j][p-1]!='.'){
    		    		add(0,j);//将向外扩散的文法小圆点向后移一位 
    		    		v++;
    		    	}
    	    	}
    		}
        	else{//除I0以外的生成项 
        		p=strlen(LR[i].ss[0]);//Ii第一句文法的长度 
        		if(LR[i].count==1&&LR[i].ss[0][p-1]=='.'){//若小圆点再最后则不进行处理 
        	    }
        		else{
    	        	p=LR[i].l;//小圆点的位置 
    	        	if(LR[i].ss[0][p+1]>='A'&&LR[i].ss[0][p+1]<'Z')
    	        	AddG(i,LR[i].ss[0][p+1]);//添加移进项目的文法
    	            //为每一个文法进行向外扩散 
    	        	for(j=0;j<LR[i].count;j++){
    	        		add(i,j);//将待向外扩散的文法小圆点向后移一位 
    	        		v++;
    	            }
    	            
    	        }
                Compare(i);//对所有已生成的项进行比较,若有重复的则删除i值靠后的 
    		}
    	}
        //将生成的项进行整理,补齐有缺的部分(删除重复的之后可能会有内容为空,从后面补齐) 
        for(i=0;i<20;i++){
        	for(j=i+1;j<20;j++){
        		if(LR[i].count==0&&LR[j].count!=0&&LR[i].num<LR[j].num){
        			fix(i,j);
        			LR[i]=LR[j];
        			LR[j].count=0;    			
    			}
    		}
    	}
    	//对当前的生成项进行编号 
    	for(i=0;LR[i].count!=0;)
    	i++;
    	v=i;
    	//输出当前生成项及各项的文法 
    	cout<<"各项的序号和文法内容:"<<endl;
    	for(i=0;i<v;i++){
        	cout<<i<<":"<<endl;
        	for(j=0;j<LR[i].count;j++)
        	cout<<LR[i].ss[j]<<endl;
            cout<<endl;
        }  
    } 
    
     
    //分析表根据第一行进行匹配处理 
    void match(int a,int b){
    	int i,j;
    	char k;
    	if(b==0&&LR[a].count==1&&strlen(LR[a].ss[b])-1==LR[a].l){//若是终结文法 (即小圆点在最后) 
    		if(LR[a].ss[b][0]=='Z')//且是初始符终结 
        	strcpy(r[a+1],"acc");
        	else
    		for(i=0;i<5;i++)//Action都输出r 
    		r[a+1][i]='r';
    	}
        else{//不是终结文法,k储存小圆点后一个字符,进行比较判断 
        	if(b==0)
        	k=LR[a].ss[b][LR[a].l+1];
        	else
        	k=LR[a].ss[b][4];
        	for(i=0;i<strlen(r[0]);i++){
        		if(r[0][i]==k)
        		rr[a+1][i]=LR[a].c[b];
        	}
    	}
    }
     
    //进行分析表的构建和输出 
    void Output(){
    	int i,j,k,temp;
    	strcpy(r[0],"abcd#EAB");//分析表的第一行 
    	cout<<"LR0分析表:"<<endl;
    	cout<<setw(20)<<"Action"<<setw(18)<<"Goto"<<endl; 
    	//分析表根据第一行进行匹配 
        for(i=0;i<v;i++){
        	for(j=0;j<LR[i].count;j++)
        	match(i,j);//进行匹配处理 
    	}
    	//进行分析表输出形式的处理 
    	for(i=0;i<v+1;i++){
    		temp=0;
    		//保证输出对其 
    		if(i==0)
    		cout<<"   ";
            if(i>0&&i<=10)
        	cout<<" "<<i-1<<":";
        	if(i>10)
        	cout<<i-1<<":";
        	if(strcmp(r[i],"acc")==0)
        	cout<<setw(24);
        	//先输出Action部分 
    		for(j=0;j<5;j++){
    		    if(r[i][j]=='r'){//输出终结文法 
        	    	cout<<setw(4)<<r[i][j]<<k;
        	    	temp=1;
        	    }
        	    else if(strcmp(r[i],"acc")==0)//输出起始符的终结欸文法 
        	    cout<<r[i][j];
    	    	else{ 
    	    		if(i==0)
        	    	cout<<setw(5)<<r[i][j];
        	    	else if(rr[i][j]==0)
        	    	cout<<setw(5)<<" ";
        	    	else
        	    	cout<<setw(4)<<"S"<<rr[i][j];
        	    }
    	    }
    	    if(temp==1)
    	    k++;//进行对r1、r2、r3等下标的处理 
    	    //再输出Goto部分 
    		for(j=5;j<strlen(r[0]);j++){
    			if(i==0)
        	    cout<<setw(5)<<r[i][j];
        	    else if(rr[i][j]==0)
        	    cout<<setw(5)<<" ";
        	    else
        	    cout<<setw(5)<<rr[i][j];
    		}
    		cout<<endl;
    	}
    }
    
    //主函数 
    int main(){
    	int i,j;
    	Init();
    	//input();//输入上下文无关文法 
    	gfj();//规范集的构建 
    	//Excels();
        Output();//输出分析表 
    } 
    

    在这里插入图片描述

    展开全文
  • 当你打开ArcGIS属性,对矢量进行面积或其他计算时,发现如图所示问题,兄弟莫方...........,接下来用两种方法保证你满意。   主要方法: 一、设置系统时间。 二、字段属性设置。 具体操作: 一、(1) ...

    当你打开ArcGIS属性表,对矢量进行面积或其他计算时,发现如下图所示问题,兄弟莫方...........,接下来用两种方法保证你满意

        

    主要方法:

    一、设置系统时间。

    二、字段属性设置。

    具体操作:

    一、(1) 点击系统时间设置(环境:Windows 7)

    一、(2) 点击更改日期和时间(环境:

    一、(3) 点击更改日历设置

    一、(4) 自定义格式点击数字,在零起点显示按钮选择0.7,然后确定。

    一、(5) 关闭ArcGIS属性表,重新打开就看到下面的显示,意不意外,开不开心。

                   

    方法二:

    二、(1) 在属性表当前字段头部右键,点击属性,再点击数据格式。

    二、(2) 在数值格式框中,类别选择自定义,这样你就可以选择0.0去展示你喜欢阿德数据了。

    总结: 方法一可以很好的将所有不显示的都显示出来,方法二具有很好的局部性,至于啥原因,我也不晓得,等我晓得了再写出来《》《》。

    展开全文
  • 深入理解ClickHouse-本地和分布式

    万次阅读 2019-09-12 09:46:12
    在集群的每个机器上面建立本地 这里需要谨记,在进行下面的操作前(使用ReplicatedMergeTree引擎),必须保证集群配置中internal_replication=true且配置了zookeeper。 1. 先任选一台机器建个插入数据(方便...

    在集群的每个机器上面建立本地表

    这里需要谨记,在进行下面的操作前(使用ReplicatedMergeTree表引擎),必须保证集群配置中internal_replication=true且配置了zookeeper。

    1. 先任选一台机器建个表插入数据(方便测试)

    CREATE TABLE IF NOT EXISTS bank (\
    age UInt16, \
    job String, \
    marital String, \
    education String, \
    default String, \
    housing String, \
    loan String, \
    contact String, \
    month String, \
    day_of_week String, \
    duration UInt32, \
    campaign UInt32, \
    pdays UInt64, \
    previous UInt8, \
    poutcome String, \
    empvar_rate Float64, \
    cons_price_idx Float64, \
    cons_conf_idx Float64, \
    euribor3m Float64, \
    nr_employed Float64 \
    ) ENGINE = MergeTree() \ 
    PARTITION BY month \
    ORDER BY (education, age) \ 
    SETTINGS index_granularity = 8192;
    

    导入数据:

    # 插入文件数据
    cat /root/clickhouse-packages/data/bank_data.csv | clickhouse-client --host=ckprd1 --port=9000 --database=default --query="INSERT INTO bank FORMAT CSVWithNames" --input_format_allow_errors_num=100000
    
    

    这里有几个需要注意的点:

    • FORMAT CSVWithNames是带字段名的,如果单纯是FORMAT CSV是会将首行当做数据行而不是字段名处理会出错的;关于FORMAT后面会再单独谈
    • input_format_allow_errors_num这个参数是读取csv格式时候容错的数量

    2. 在集群的每个机器上面建立本地表

    1)方式一:在每个集群上分别运行下面的代码

    CREATE TABLE IF NOT EXISTS bank_replica (\
    age UInt16,\
    job String,\
    marital String,\
    education String,\
    default String,\
    housing String,\
    loan String,\
    contact String,\
    month String,\
    day_of_week String,\
    duration UInt32,\
    campaign UInt32,\
    pdays UInt64,\
    previous UInt8,\
    poutcome String,\
    empvar_rate Float64,\
    cons_price_idx Float64,\
    cons_conf_idx Float64,\
    euribor3m Float64,\
    nr_employed Float64\
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/bank_replica', '{replica}')\
    PARTITION BY month\
    ORDER BY (education, age) \
    SETTINGS index_granularity = 8192;
    

    ReplicatedMergeTree用的就是macros里面配置的参数了:

    • /clickhouse/tables/是一般性前缀,建议别动保持原样
    • {layer}-{shard}是分片识别符,同一个分片内的所有机器应该保持相同。我这里使用的是集群名+分片名的配置,我也建议大家效法我的做法,还是比较靠谱的。
    • /clickhouse/tables/{layer}-{shard}/bank_replica + {replica}作为整体可以理解为表在zookeeper中的定位和识别符,因此每个表必须不同;bank_replica这个地方建议使用表名,{replica}参数建议在macros里面配置成机器的hostname,因为每台机器的hostname都是不一样的,因此就能确保每个表的识别符都是唯一的了(当然那种3台机器相互备份的集群可能在这里就不合适了,但是毕竟3台机器相互备份是个野路子,不建议大家采用的)

    2)方式二:一次性在集群每个机器上建立本地表

    -- Replicated Table
    CREATE TABLE IF NOT EXISTS bank_replica ON CLUSTER mcd_prod_cluster_1st (\
    age UInt16,\
    job String,\
    marital String,\
    education String,\
    default String,\
    housing String,\
    loan String,\
    contact String,\
    month String,\
    day_of_week String,\
    duration UInt32,\
    campaign UInt32,\
    pdays UInt64,\
    previous UInt8,\
    poutcome String,\
    empvar_rate Float64,\
    cons_price_idx Float64,\
    cons_conf_idx Float64,\
    euribor3m Float64,\
    nr_employed Float64\
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/bank_replica', '{replica}')\
    PARTITION BY month\
    ORDER BY (education, age) \
    SETTINGS index_granularity = 8192;
    

    删除表:

    DROP TABLE bank_replica ON CLUSTER mcd_prod_cluster_1st
    

    这里为了验证ReplicatedMergeTree本身是可以同步和复制数据的,可以往一个分片里面某个表里面写入数据,看下其它备份是否也会有同样的数据:

    INSERT INTO bank_replica SELECT * FROM bank
    

    查询结果:

    ckprd1 :) select count(1) from bank_replica;         
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    27595 │
    └──────────┘
    
    ckprd2 :) select count(1) from bank_replica;         
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    27595 │
    └──────────┘
    
    ckprd3 :) select count(1) from bank_replica;   
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │        0 │
    └──────────┘
    
    ckprd4 :) select count(1) from bank_replica;   
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │        0 │
    └──────────┘
    

    因为执行插入操作在ckprd1节点,而ckprd2和ckprd1属于同一个分片,所以数据相同。而ckprd3和ckprd4属于另一个分片,没有数据。

    下面我会介绍使用分布式表的方式在两个分片上面分布数据。

    3. 在集群的每个机器上面建立分布式表

    同样的,和建立本地表一样,分布式表也需要在每个机器上建立,同样的也可以一个一个机器去分别建立,也可以一次性在所有节点创建表。 这里直接放出一次性建立所有的代码:

    CREATE TABLE bank_dist ON CLUSTER mcd_prod_cluster_1st \
    AS bank_replica \
    ENGINE = Distributed(mcd_prod_cluster_1st, default, bank_replica, rand());
    

    Distributed表引擎后面依次是集群名、库名、表名、数据分配方式。

    关于分布式表我划重点如下:

    • 分布式表本身并不存储数据,只是提供了一个可以分布式访问数据的框架,查询分布式表的时候clickhouse会自动去查询对应的每个本地表中的数据
    • 注意AS bank_replica,它表明了分布式表所对应的本地表(本地表是存储数据的)
    • 可以配置Distributed表引擎中的最后一个参数来设置数据条目的分配方式
    • 可以直接往分布式表中写数据,clickhouse会自动按照上一点所说的方式来分配数据和自平衡
    • 也可以自己写算法,然后往本地表中写数据(当然这个就比较高级了)

    另外,这里在每个机器上建立分布式表和上面的在每个机器上建立本地表的目的完全不同,这里即使只在一个机器上建分布式表也是可以的。只是说,在每个机器上建分布式表的话,那么可以在每个服务器上都做分布式查询了。

    可以往各服务器上的任何一个分布式表里面写入数据(插入数据之前,可以先把bank_replica表数据删除):

    INSERT INTO bank_dist SELECT * FROM bank;
    

    查询结果:

    ckprd1 :) select count(1) from bank_replica;
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    13832 │
    └──────────┘
    
    
    ckprd2 :) select count(1) from bank_replica;
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    13832 │
    └──────────┘
    
    
    
    ckprd3 :) select count(1) from bank_replica;
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    13763 │
    └──────────┘
    
    
    
    ckprd4 :) select count(1) from bank_replica;
    
    SELECT count(1)
    FROM bank_replica 
    
    ┌─count(1)─┐
    │    13763 │
    └──────────┘
    
    

    4. ClickHouse数据存储

    1)一个分区一个文件夹

    default数据库下面的bank_replica表的数据结构如下:
    [外链图片转存失败(img-kFDRvV9i-1568252836912)(evernotecid://4CF2DB7A-63C8-4462-AF1B-D4FBD7AC5C92/appyinxiangcom/215407/ENResource/p779)]

    查看分区信息:

    ckprd1 :) SELECT      partition,     name,      active FROM system.parts  WHERE table = 'bank_replica';
    
    SELECT 
        partition, 
        name, 
        active
    FROM system.parts 
    WHERE table = 'bank_replica'
    
    ┌─partition─┬─name─────────────────────────────────┬─active─┐
    │ dec     │ 0dcda14aa879a9e9de8ce0a075dac042_3_3_0 │    1 │
    │ mar     │ 534f9f773916a62e1ce21b79e23ba5e7_3_3_0 │    1 │
    │ oct     │ 6d3d797dfda12e0b8c837064b52bacc8_3_3_0 │    1 │
    │ jun     │ 9a34545ffc3f5f4b8bee104063c6dd61_3_3_0 │    1 │
    │ nov     │ 9bbaa4d2c2df481f7661e7257563da2d_3_3_0 │    1 │
    │ sep     │ a6ad89f019506d5c2359e353d73e033d_3_3_0 │    1 │
    │ apr     │ b3478f1e0b48f24b48cfc42239749609_3_3_0 │    1 │
    │ jul     │ e0f64a6601e692e6c7761024aa627976_3_3_0 │    1 │
    │ aug     │ f3fd28549b760f6d22e03bab5d963e1b_3_3_0 │    1 │
    │ may     │ f6139eb0d4e1e322ceebd4cc93d30326_3_3_0 │    1 │
    └───────────┴──────────────────────────────────────┴───────┘
    
    10 rows in set. Elapsed: 0.002 sec. 
    
    

    2)每个分区下一个字段存储为一个被压缩的小文件,以及对应的索引/顺序标识,空值会有特殊的文件记录
    在这里插入图片描述

    展开全文
  • Hive中小与大关联(join)的性能分析

    万次阅读 多人点赞 2018-06-30 11:14:07
    经常看到一些Hive优化的建议中说当小与大做关联时,把小写在前面,这样可以使Hive的关联速度更快,提到的原因都是说因为小可以先放到内存中,然后大的每条记录再去内存中检测,最终完成关联查询。...
  • 邻接

    万次阅读 多人点赞 2019-08-27 17:06:30
    邻接 我们发现,当图中的边数相对于顶点较少时,邻接矩阵是对存储空间的极大浪费。我们可以考虑对边或弧使用链式存储的方式来避免空间浪费的问题。回忆树结构的孩子表示法,将结点存入数组,并对结点的孩子进行...
  • 编译原理根据项目集规范族构造LR(0)分析

    万次阅读 多人点赞 2018-01-14 19:45:30
    本文主要讲LR(0)分析的构造和输入串分析过程。 我这个菜鸡都觉得是通!俗!易!懂!的!! 憋说话往看-> 多的不扯,博(cai)主(ji)我使用的是清华大学出版社的《编译原理第二版》,第二版哦,不知道第三版
  • Greenplum是关系型的分布式数据库,需要存储的...本篇介绍查询某模式所有的分布键信息,适用于: 排查是否有分布键创建不合理的,如果分布键是重复率比较高的字段会造成数据分布不均匀,存储过于倾斜。 ...
  • 最近复习数据结构中的哈希,发现在计算等概率情况查找不成功的平均查找长度时不太理解,不知道到底是怎么计算出来的。看了几篇博客后终于知道如何计算了,总结如下。 例题: 将关键字序列(7、8、30、11、...
  • MySQL临时与内存

    千次阅读 2019-01-13 12:03:18
    在MySQL中有三种虚拟:临时、内存、视图。下面简单介绍一下临时和内存的使用。 1、临时 MySQL临时在我们需要保存一些临时数据时是非常有用的。临时在MySQL 3.23版本中添加。临时只在当前连接...
  • 经常使用ArcGIS的朋友可能会注意到,ArcMap图层的属性中数字型的属性值小数点如果是0,经常会不显示,如图: 出现这样的情况很多时候我们都觉得是ArcGIS软件的设置问题,其实不然,是操作系统设置的问题,解决...
  • SW转发与MAC地址

    千次阅读 多人点赞 2020-07-16 12:18:26
    文章目录一、MAC地址二、拓扑三、基础配置与分析四、SW的数据转发五、MAC地址安全5.1 攻击原理5.2 防御措施 一、MAC地址 1、作用: MAC记录了相连设备的MAC地址、接口号以及所属的VLAN ID之间的对应关系。在...
  • MySQL对数据已有进行分区

    万次阅读 2017-02-25 18:41:16
    对现有的一个进行创建分区,并把数据迁移到新,可以按时间来分区,然后这不是实时更新,每天有一次插入操作。 时间比较充裕,但是服务器上有其他应用,使用较小资源为主要方式。 操作方式@1 可以使用ALTER...
  • 工作中,我们时常统计某个模式有哪些中有多少条记录,如果每张去统计,工作量会非常的大。介绍一种简单方便的统计方法: 1.创建一张临时: create global temporary table test(tab_name varchar(30),...
  • oracle 导出某个用户所有数据

    万次阅读 2018-09-07 09:26:30
    1:如果要导入的用户有空,需要执行下面语句 select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 查询出的数据拷出来,再次执行 2:cmd进入命令,导出 导出用户...
  • GDT

    千次阅读 2019-04-20 00:35:47
    gdt在x86架构中用来存储内存的分段信息,通过段选择子进行访问,的大小=0x10000=65536字节,每个项占8字节,第一个项为空,不使用,因此一共有8191个可用项。项结构如下 (图片来自...
  • 数据结构 Hash(哈希

    万次阅读 多人点赞 2018-05-20 01:23:34
    什么是Hash 要想知道什么是哈希,那得先了解哈希函数 哈希函数 对比之前博客讨论的二叉排序树 二叉平衡树 红黑树 B B+树,它们的查找都是先从根节点进行查找,从节点取出数据或索引与查找值进行比较。那么...
  • 1、ARP   提起ARP必然先想起ARP(address resolution protocol)协议,地址解析协议。   在实际应用中,我们经常遇到这样的问题:已知一个机器的IP地址,但在实际网络的链路上传送数据帧时,最终还是必须...
  • LR(0)项目集规范族和分析的构造

    千次阅读 2018-10-10 13:46:45
    分析由两部分构成,一部分为动作,表示当前状态面临输入符号时应该做的动作为移进、归约、接受还是出错。动作的列标只包含终结符和结束符#;另一部分为转换,它表示在当前状态面临文法符号时应该转向的...
  • MySQL创建数据库和创建数据

    万次阅读 多人点赞 2019-10-20 23:44:40
    MySQL 创建数据库和创建数据 MySQL 是最常用的数据库,在数据库操作中,基本都是增删改查操作,简称CRUD。 在这之前,需要先安装好 MySQL ,然后创建好数据库、数据、操作用户。 一、数据库操作语言 数据库...
  • 文章目录前言三线生成一张表格设置标题和交叉引用设置三线选中表格...wps版本:v11.1.0.11365-release 三线 生成一张表格 这一步不做过多说明 设置标题和交叉引用 首先我们需要选中表格点击题注,一般我们都把
  • MySQL基本操作一:数据库和

    万次阅读 多人点赞 2018-05-23 21:55:49
    本章,主要就数据库和的基本操作作以总结。 需要事先说明的一点是,我写的所有MySQL的代码将采用大写形式。虽然说至少在MySQL环境,SQL语句的大小写并不会影响代码运行结果,但是,有同行讲到,SQL语句大写比...
  • mysql中dual

    万次阅读 2019-04-09 22:17:46
    今日在某项目数据库中发现每个库底下都有这样一张,如图所示: 这张表有且只能有一条数据,结构如下所示: 我想这样做必然有其精神奥义和奇技淫巧,于是一探究竟。 2. mysql中模拟dual 因为早期的mysql中...
  • QCheckBox样式

    万次阅读 2019-11-28 23:50:52
    Background-color:rgb(0,0,0); } //选择框 QCheckBox::indicator { Width:13px; Height:13px; } //未选中状态的选择框 QCheckBox::indicator:unchecked { } QCheckBox::indicator:unche...
  • kettle 输入、输出

    千次阅读 2018-11-23 12:03:58
    (1) 输入 —输出 ...6、 限制改成 0 (默认是1000,即只提交1000个记录) 注意点: 1、 命名步骤名称 2、 选择目标源 3、 目标 命名 4、 勾选 裁剪, 则以后每次 执行 这个过程,都先删除 目标...
  • 在图中任何两个顶点之间都可能存在联系,所以图的存储结构应该需要...常用的存储结构有邻接矩阵、邻接(逆邻接)、十字链、邻接多重、 边集数组。那么本博文将带你就 “邻接(逆邻接)” 来窥探一二。。。
  • Navicat Premium 12看不到PostgreSQL已创建的 正文 问题: 通过Navicat Premium 12连接PostgreSQL之后发现找不到已存在的,通过PostgreSQL自带的连接工具可以看到是已经存在了的。 解决办法 ...
  • MySql 学生 科目 成绩 查询学生各科成绩 2016年08月16日 01:05:02lzxomg阅读数 8155 版权声明:本文注明出处可以转载。 https://blog.csdn.net/lzxomg/article/details/52216222 下载 Navicat备份的Sql...
  • 广义的表头表尾

    万次阅读 2019-07-26 12:07:38
    把好久之前的C语言的知识记录整理发送 广义 表头表尾 head() 返回列表的第一个元素; tail() 返回列表的删去第一个元素之后的剩余列表; 已知广义: A=(a,b), B=(A,A), C=(a,(b,A),B), 求下列运算的结果: ...
  • LR(0)和SLR分析的构造

    万次阅读 2016-05-24 18:58:01
    LR(0)和SLR分析的构造 上篇文章中,我已经说到了,LR(0)分析是LR(0)分析器的重要组成部分,它是总控程序分析动作的依据,他是由LR(0)项目集规范族来进行 构造的。他的结构主要有两个部分ACTION 和GOTO    ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,927,304
精华内容 1,170,921
关键字:

下表0