首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Hadoop Hive概念学习系列之hive里的分区(九)

为了对表进行合理的管理以及提高查询效率,Hive可以将表组织成“分区”。 分区是表的部分列的集合,可以为频繁使用的数据建立分区,这样查找分区中的数据时就不需要扫描全表,这对于提高查找效率很有帮助。 分区是一种根据“分区列”(partition column)的值对表进行粗略划分的机制。Hive中的每个分区对应数据库中相应分区列的一个索引,每个分区对应着表下的一个目录,在HDFS上的表现形式与表在HDFS上的表现形式相同,都是以子目录的形式存在。 一个表可以在多个维度上进行分区,并且分区可以嵌套使用。建分区需要在创建表时通过PARTITIONED BY子句指定,例如: CREATE TABLE logs( timestamp BIGINT, line STRING ) PARTITIONED BY (date STRING,country STRING); 在将数据加载到表内之前,需要数据加载人员明确知道所加载的数据属于哪一个分区。 使用分区在某些应用场景下能给有效地提高性能,当只需要遍历某一个小范围内的数据或者一定条件下的数据时,它可以有效减少扫描数据的数量,前提是需要将数据导入到分区内。 注意:PARTITONED BY子句中定义的列是表中正式的列(分区列),但是数据文件内并不包含这些列。 在Hive里,为什么要分区? 庞大的数据集可能需要耗费大量的时间去处理。在许多场景下,可以通过分区或切片的方法减少每一次扫描总数据量,这种做法可以显著地改善性能。 数据会依照单个或多个列进行分区,通常按照时间、地域或者是商业维度进行分区。比如vido表,分区的依据可以是电影的种类和评级,另外,按照拍摄时间划分可能会得到更一致的结果。为了达到性能表现的一致性,对不同列的划分应该让数据尽可能均匀分布。最好的情况下,分区的划分条件总是能够对应where语句的部分查询条件。 Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。 Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105053.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark GraphX概念学习系列之Spark GraphX的使用(二)

节点属性或结构生成新的图。 GraphX 提供了丰富的针对图数据的操作符。 Graph 类中定义了核心的、优化过的操作符。一些更加方便的由底层核心操作符组合而成的上层操作符在 GraphOps 中进行定义。正是通过 Scala 语言的 implicit 关键字, GraphOps 中定义的操作符可以作为Graph 中的成员。这样做的目的是未来 GraphX 会支持不同类型的图,而每种类型的图的呈现必须实现核心的操作符和复用大部分的 GraphOps 中实现的操作符。 下面将操作符分为几个类别进行介绍 (1)属性操作符 表1给出了 GraphX 的属性操作符。通过属性操作符,用户可以在点或边上进行相应运算,构建和开发图算法。 表 1 属性操作符 (2)结构操作符 表 2 所示为 GraphX 的结构操作符。通过结构操作可以生成改变图结构之后的图数据。 表 2 结构操作符 (3)图信息属性 表 3 所示为图信息属性,通过图信息属性,用户可以获取图上的统计信息。 表 3 图信息属性 (4)邻接聚集操作符与 Join 操作符 表 4 所示为邻接聚集操作符与 Join 操作符。通过邻接操作符可以将两个相近的表进行连接。 表 4 邻接聚集操作符与 Join 操作符 (5)缓存操作符 表 5 所示为缓存操作符。 表 5 缓存操作符 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5725398.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

JNI学习笔记之ndk-build手动编译并集成流程

参考 一天掌握Android JNI本地编程 快速入门Android开发实践:常用NDK命令行参数Secrets of Android.mk JNI JNI是啥? JNI(Java Native Interface):Java本地开发接口,JNI是一个协议,用来沟通Java代码和外部的本地代码(c/c++),外部的c/c++代码也可以调用Java代码 为什么使用JNI 效率上C/C++是本地语言,比Java更高效 代码移植,如果之前用C语言开发过模块,可以复用已经存在的C代码 Java反编译比C语言更容易,一般加密算法都是用C语言编写,不容易被反编译 Java基本数据类型与C语言基本数据类型的对应 Java基本数据类型与C语言基本数据类型的对应 Java引用类型对应 Java引用类型对应 堆内存和栈内存的概念 栈内存 系统自动分配和释放,保存全局,静态,局部变量,在栈上分配内存叫今天内存,大小一般是固定的。 堆内存 程序员手动分配(mallc/new)和释放(free/java不用手动释放,有GC回收),在堆上分配内存叫动态分配,一般硬件内存有多大内存就有多大。 交叉编译 交叉编译的概念 交叉编译记载一个平台,编译出另一个平台能够执行的二进制代码 主流平台:Windows,Mac os,Linux 主流处理器:X86,arm,mips 交叉编译的原理 即在一个平台上,模拟其它平台的特性 编译的流程:源代码》编译》链接》可执行程序 交叉编译的工具链 多个工具的集合,一个工具使用完后接着调用下一个工具 常见的交叉编译工具 NDK(Native Development Kit):开发JNI必备工具,就是模拟其它平台特性类编译代码的工具 CDP(C/C++ Development Tools):是Eclipse开发C语言的一个插件,高亮显示C语言的语法 Cygwin:一个Windows平台的Unix模拟器 NDK的目录结构 这里我下的ndk版本是15.2.4203891 比较新了,配置NDK环境变量大家应该都会,这里我就不提了 目前NDK最新的目录 ndk-build方式手动编译出so库文件 一个简单的例子 1.编写java代码 这个直接在工程目录下正常编辑你的代码,比如我的这个JNIUtils是在com.newtrekwang.ndkpractice包下的,这个类声明了一个方法,功能就是获取从C层传来的字符串。方法的具体实现当然是在C层实现啦。所以这个就跟java的接口定义差不多。 package com.newtrekwang.ndkpractice; public class JNIUtils { public static native String getStringFromC(); } 2.编写c层代码 这里如果想快速写一个与之关联的头文件的话,(java7)可以使用javah命令生成,不过命令要在你的类的所在包的根路径执行 比如我这个: javah 可以看下头文件的代码: /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_newtrekwang_ndkpractice_JNIUtils */ #ifndef _Included_com_newtrekwang_ndkpractice_JNIUtils #define _Included_com_newtrekwang_ndkpractice_JNIUtils #ifdef __cplusplus extern "C" { #endif /* * Class: com_newtrekwang_ndkpractice_JNIUtils * Method: getStringFromC * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_newtrekwang_ndkpractice_JNIUtils_getStringFromC (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif 可以看到里面已经帮我们写好了一个与Java类getStringFromC对应的Native函数Java_com_newtrekwang_ndkpractice_JNIUtils_getStringFromC,命名格式就是Java加完整类名加方法名 然后我把这个头文件剪切到另一个新建的文件夹prac1里,这个文件夹专门存放c/c++真个编译过程的产物,比如最后我要得到so文件,就从这里面拿 然后我们新建一个hello.c实现头文件里面的函数 #include<com_newtrekwang_ndkpractice_JNIUtils.h> #include<stdio.h> #include<stdlib.h> JNIEXPORT jstring JNICALL Java_com_newtrekwang_ndkpractice_JNIUtils_getStringFromC (JNIEnv* env, jclass obj){ char* str="Hello from C!"; jstring result=(*env)->NewStringUTF(env,str); return result; } (1)JNIEXPORT :在Jni编程中所有本地语言实现Jni接口的方法前面都有一个"JNIEXPORT",这个可以看做是Jni的一个标志,至今为止没发现它有什么特殊的用处。 (2)void :这个学过编程的人都知道,当然是方法的返回值了。 (3)JNICALL :这个可以理解为Jni 和Call两个部分,和起来的意思就是 Jni调用XXX(后面的XXX就是JAVA的方法名)。 (4)Java_com_test01_Test_firstTest:这个就是被上一步中被调用的部分,也就是Java中的native 方法名,这里起名字的方式比较特别,是:包名+类名+方法名。 (5)JNIEnv * env:这个env可以看做是Jni接口本身的一个对象,在上一篇中提到的jni.h头文件中存在着大量被封装好的函数,这些函数也是Jni编程中经常被使用到的,要想调用这些函数就需要使用JNIEnv这个对象。例如:env->GetObjectClass()。(详情请查看jni.h) 3.编写Android.mk Android.mk 里面就是些设置编译配置的脚本 例如我的这个: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE :=hello LOCAL_SRC_FILES := hello.c com_newtrekwang_ndkpractice_JNIUtils.h include $(BUILD_SHARED_LIBRARY) 常见Android.mk语句解释 LOCAL_PATH := $(call my-dir) 一个Android.mk文件必须以LOCAL_PATH变量的定义开始,它用于在开发树中查找源文件。在这个例子中,构建系统提供的宏函数'my-dir'被用来返回 当前目录的路径(即包含Android.mk文件本身的目录)。 include $(CLEAR_VARS) CLEAR_VARS变量由构建系统提供,并指向一个特殊的GNU Makefile,它将清除许多LOCAL_XXX变量 (例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等),但除了LOCAL_PATH,这个是需要的,因为所有的构建控制文件在单个GNU Make执行上下文中解析,其中所有变量都是全局的。 LOCAL_MODULE :=hello 定义LOCAL_MODULE变量来标识您在Android.mk中描述的每个模块,构建系统为自动为模块添加前缀和后缀,例如我这个是hello,他最终会生成libhello.so LOCAL_SRC_FILES := hello.c com_newtrekwang_ndkpractice_JNIUtils.h LOCAL_SRC_FILES变量必须包含C和/或C ++源文件的列表,这些文件将被构建并组装到一个模块中。这里可以只列出源文件,不需要头文件,头文件构建系统会自动查找 更多Android.mk功能请见Secrets of Android.mk 然后我的prac1文件现在有这个三个文件了 prac1 然后在此目录下执行ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=./Android.mk 如图: image.png 然后再看我们的文件夹就是这样了: image.png image.png 常见ndk-build命令行参数 NDK_LOG=1:配置log级别,打印ndk编译时的详细输出信息 NDK_PROJECT_PATH=.:制定NDK编译的代码路径为当前目录,如果不配置,则必须把工程代码放到Android工程的jni目录下 APP_BUILD_SCRIPT=./Android.mk:指定NDK编译使用的Android.mk文件 NDK_APP_APPLICATION_MK=./Application.mk:指定NDK编译使用的Application.mk文件 CLEAN:清除所有编译出来的临时文件和目标文件 -B:强制重新编译已经编译完成的的代码 NDK_DEBUG=1:执行 debug build NDK_DEBUG=0:执行release build NDK_OUT=./mydir:指定编译生成的文件的存放位置 -C /opt/myTest/:到指定目录编译native代码 4.在Android项目中集成so文件 首先把那些so文件拷到Android工程的libs目录下 拷so文件 gradle配置库文件目录 在android块下设置sourceSets块即可,比如我这里设置的是libs文件夹,说明我的so库文件在libs文件夹里。 sourceSets { main { jniLibs.srcDirs=["libs"] //指定库文件的目录,java代码编译时链接用 } } 然后gradle同步一下,即可在Android模式目录下看到jniLibs文件包,证明gradle已经识别了so库文件 jniLibs 完善java代码 就是在原来的基础上加了个静态块,里面的System.loadLibrary("hello")功能就是加载hello这个库文件,不然下面的native方法不能正常执行 package com.newtrekwang.ndkpractice; public class JNIUtils { static { System.loadLibrary("hello"); } public static native String getStringFromC(); } 然后就可以愉快的使用调方法了 比如我这里这个TextView显示的字符串就是就是从JNIUtils类的native方法调出来的。 实例

优秀的个人博客,低调大师

Hadoop Hive概念学习系列之hive里的桶(十一)

Hive还可以把表或分区,组织成桶。将表或分区组织成桶有以下几个目的: 第一个目的是为看取样更高效,因为在处理大规模的数据集时,在开发、测试阶段将所有的数据全部处理一遍可能不太现实,这时取样就必不可少。 第二个目的是为了获得更好的查询处理效率。 桶为了表提供了额外的结构,Hive在处理某些查询时利用这个结构,能给有效地提高查询效率。 桶是通过对指定列进行哈希计算来实现的,通过哈希值将一个列名下的数据切分为一组桶,并使每个桶对应于该列名下的一个存储文件。 在建立桶之前,需要设置hive.enforce.bucketing属性为true,使得hive能识别桶。 以下为创建带有桶的表的语句: CREATE TABLE bucketed_user( id INT, name String ) CLUSTERED BY (id) INTO 4 BUCKETS; 向桶中插入数据,这里按照用户id分成了4个桶,在插入数据时对应4个reduce操作,输出4个文件。 分区中的数据可以被进一步拆分成桶,bucket,不同于分区对列直接进行拆分,桶往往使用列的哈希值进行数据采样。 在分区数量过于庞大以至于可能导致文件系统崩溃时,建议使用桶。 桶的数量是固定的。 Hive使用基于列的哈希函数对数据打散,并分发到各个不同的桶中从而完成数据的分桶过程。 注意,hive使用对分桶所用的值进行hash,并用hash结果除以桶的个数做取余运算的方式来分桶,保证了每个桶中都有数据,但每个桶中的数据条数不一定相等。 哈希函数的选择依赖于桶操作所针对的列的数据类型。除了数据采样,桶操作也可以用来实现高效的Map端连接操作。 记住,分桶比分区,更高的查询效率。 如何进行桶操作? 例子1 1、创建临时表 student_tmp,并导入数据。 hive> desc student_tmp; hive> select * from student_tmp; 2、创建 student 表。经过分区操作过后的表已经被拆分成2个桶。 create table student( id int, age int, name string ) partitioned by (stat_date string) clustered by (id) sorted by(age) into 2 bucket row format delimited fields terminated by ','; 分区中的数据可以被进一步拆分成桶!!!正确理解 所有,桶,先partitioned by(stat_date string) ,再,clustered by(id) sorted by(age) into 2 bucket 3、设置环境变量。 hive> set hive.enforce.bucketing=true; 4、插入数据 hive> from student_tmp insert overwrite table student partition(stat_date='2015-01-19') select id,age,name where stat_date='2015-01-18' sort by age; 这都是固定的格式,一环扣一环的。 5、查看文件目录 $ hadoop fs -ls /usr/hive/warehouse/student/stat_date=2015-01-19/ 6、查看 sampling 数据。 tablesample 是抽样语句,语法如下 tablesample(bucket x out of y) y 必须是 table 中 BUCKET 总数的倍数或者因子。 例子2 在下面的例子中,经过分区操作过后的表已经被拆分成100个桶。 CREATE EXTERNAL TABLE videos_b( prodicer string, title string, category string ) PARTITIONED BY(year int) CLUSTERED BY(title)INTO 100 BUCKETS; 现在,我们开始填充这张带桶操作的表: set hive.enfirce.bucketinig=true; FROM videos INSERT OVERWRITE TABLE videos_b PARTITION(year=1999) SELECT producer,title,string WHERE year=2009; 如果不使用set hive.enforce.bucketing=true这项属性,我们需要显式地声明set mapred.reduce.tasks=100来设置Reducer的数量。 此外,还需要在SELECT语句后面加上CLUSTERBY来实现INSERT查询。 下面是不使用桶设置的例子: set mapred.reduce.tasks=100; FROM videos INSERT OVERWRITE TABLE videos_b PARTITION(year=1999) SELECT producer,title,string WHERE year=2009 CLUSTER BY title; 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105143.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

Spark SQL概念学习系列之Spark SQL是什么?(一)

不多说,直接上干货! Spark SQL提供在大数据上的SQL查询功能,类似于Shark在整个生态系统的角色,它们可以统称为SQL on Spark。 之前,Shark的查询编译和优化器依赖于Hive,使得Shark不得不维护一套Hive分支,而Spark SQL使用Catalyst做查询解析和优化器,并在底层使用Spark作为执行引擎实现SQL的Operator。 用户可以在Spark上直接书写SQL,相当于为Spark扩充了一套SQL算子,这无疑更加丰富了Spark的算子和功能,同时Spark SQL不断兼容不同的持久化存储(如HDFS、 Hive等),为其发展奠定广阔的空间。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/5723919.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 37)——默认构造函数

结构体和类的实例在构造过程中会调用一种特殊的init方法,称为构造函数。构造函数没有返回值,可以重载。在多个构造函数重载的情况下,运行环境可以根据它的外部参数名或参数列表调用合适的构造函数。 默认构造函数 结构体和类在构造过程中会调用一个构造函数,即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数。下面看示例代码: 1 2 3 4 5 6 7 8 9 10 class Rectangle{ varwidth:Double= 0.0 varheight:Double= 0.0 } varrect=Rectangle() //创建实例,并调用默认构造函数init() rect.width= 320.0 rect.height= 480.0 print( "长方形:\(rect.width)x\(rect.height)" ) Rectangle()表示调用了某个方法,这个方法就是默认构造函数init()。 事实上,在Rectangle的定义过程中省略了构造函数,相当于如下代码: 1 2 3 4 5 6 7 8 class Rectangle{ varwidth:Double= 0.0 varheight:Double= 0.0 init(){ } } 如果Rectangle是结构体,则它的定义如下: 1 2 3 4 structRectangle{ varwidth:Double= 0.0 varheight:Double= 0.0 } 而结构体Rectangle的默认构造函数与类Rectangle的默认构造函数是不同的,相当于如下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 structRectangle{ varwidth:Double= 0.0 varheight:Double= 0.0 init(){ } init(width:Double,height:Double){ //有参数的构造函数 self.width=width self.height=height } } 要调用哪个构造函数是根据传递的参数名和参数类型决定的。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746995,如需转载请自行联系原作者

优秀的个人博客,低调大师

一脸懵逼学习Hive(数据仓库基础构架)

Hive是什么?其体系结构简介*Hive的安装与管理*HiveQL数据类型,表以及表的操作*HiveQL查询数据***Hive的Java客户端** Hive的自定义函数UDF* 1:什么是Hive(一): (1)Hive 是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 QL ,它允许熟悉 SQL 的用户查询数据。同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper 和 reducer 来处理内建的 mapper 和 reducer 无法完成的复杂的分析工作。 (2)Hive是SQL解析引擎,它将SQL语句转译成M/R Job然后在Hadoop执行。 (3)Hive的表其实就是HDFS的目录/文件,按表名把文件夹分开。如果是分区表,则分区值是子文件夹,可以直接在M/R Job里使用这些数据。2:Hive的系统架构: (1)用户接口,包括 CLI,JDBC/ODBC,WebUI(用户接口主要有三个:CLI,JDBC/ODBC和 WebUI:); CLI,即Shell命令行; JDBC/ODBC 是 Hive 的Java,与使用传统数据库JDBC的方式类似; WebGUI是通过浏览器访问 Hive; (2)元数据存储,通常是存储在关系数据库如 mysql, derby 中; Hive 将元数据存储在数据库中(metastore),目前只支持 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等; (3)解释器、编译器、优化器、执行器; 解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划(plan)的生成。生成的查询计划存储在 HDFS 中,并在随后有 MapReduce 调用执行; (4)Hadoop:用 HDFS 进行存储,利用 MapReduce 进行计算; Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(包含 * 的查询,比如 select * from table 不会生成 MapRedcue 任务)3:Hive的安装: (1)把hive-0.9.0.tar.gz复制到/usr/local (2)解压hive-0.9.0.tar.gz与重命名 #cd /usr/local #tar -zxvf hive-0.9.0.tar.gz #mv hive-0.9.0 hive (3)修改/etc/profile文件。 #vi /etc/profile 增加 export HIVE_HOME=/usr/local/hive 修改 export PATH=$JAVA_HOME/bin:$PATH:$HADOOP_HOME/bin:$HIVE_HOME/bin 保存退出 #source /etc/profile (4)cd $HIVE_HOME mv hive-env.sh.template hive-env.sh mv hive-default.xml.template hive-site.xml 修改hadoop的hadoop-env.sh(否则启动hive汇报找不到类的错误) export HADOOP_CLASSPATH=.:$CLASSPATH:$HADOOP_CLASSPATH: $HADOOP_HOME/bin 修改$HIVE_HOME/bin的hive-config.sh,增加以下三行 export JAVA_HOME=/usr/local/jdk export HIVE_HOME=/usr/local/hive export HADOOP_HOME=/usr/local/hadoop (5)启动 #hive hive>show tables; hive>create table test(id int,name string); hive>quit; 观察:#hadoop fs -ls /user/hive 参数:hive.metastore.warehouse.dir4:Hive的metastore: (1)metastore是hive元数据的集中存放地。metastore默认使用内嵌的derby数据库作为存储引擎; (2)Derby引擎的缺点:一次只能打开一个会话; (3)使用Mysql作为外置存储引擎,多用户同时访问; 5:Hive的安装: 配置MySQL的metastore (1)上传mysql-connector-java-5.1.10.jar到$HIVE_HOME/lib (2)登录MYSQL,创建数据库hive #mysql -uroot -padmin mysql>create database hive; mysql>GRANT all ON hive.* TO root@'%' IDENTIFIED BY 'admin'; mysql>flush privileges; mysql>set global binlog_format='MIXED'; (3)把mysql的数据库字符类型改为latin1 (4)修改$HIVE_HOME/conf/hive-site.xml <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://hadoop0:3306/hive?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>admin</value> </property> 6:Hive运行模式 : (1)Hive的运行模式即任务的执行环境 (2)分为本地与集群两种 我们可以通过mapred.job.tracker 来指明 设置方式: hive > SET mapred.job.tracker=local7:Hive的启动方式: (1)、hive 命令行模式,直接输入#/hive/bin/hive的执行程序,或者输入 #hive --service cli (2)、 hive web界面的 (端口号9999) 启动方式 #hive --service hwi & 用于通过浏览器来访问hive http://hadoop0:9999/hwi/ (3)、 hive 远程服务 (端口号10000) 启动方式 #hive --service hiveserver &8:Hive与传统数据库: 9:Hive的数据类型: (1)基本数据类型: tinyint/smallint/int/bigint float/double boolean string (2)复杂数据类型: Array/Map/Struct (3)没有date/datetime10:Hive的数据存储: (1)Hive的数据存储基于Hadoop HDFS; (2)Hive没有专门的数据存储格式; (3)存储结构主要包括:数据库、文件、表、视图; (4)Hive默认可以直接加载文本文件(TextFile),还支持sequence file 、RC file; (5)创建表时,指定Hive数据的列分隔符与行分隔符,Hive即可解析数据;11:Hive的数据模型-数据库: (1)类似传统数据库的DataBase (2)默认数据库"default" 使用#hive命令后,不使用hive>use <数据库名>,系统默认的数据库。可以显式使用hive> use default; 创建一个新库 hive > create database test_dw;12:Hive的数据模型-表: Table 内部表 Partition 分区表 External Table 外部表 Bucket Table 桶表 13:Hive的数据模型-内部表: (1)与数据库中的 Table 在概念上是类似 (2)每一个 Table 在 Hive 中都有一个相应的目录存储数据。例如,一个表 test,它在 HDFS 中的路径为:/ warehouse/test。 warehouse是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录 (3)所有的 Table 数据(不包括 External Table)都保存在这个目录中。 (4)删除表时,元数据与数据都会被删除 (5)创建数据文件inner_table.dat (6)创建表: hive>create table inner_table (key string); (7)加载数据: hive>load data local inpath '/root/inner_table.dat' into table inner_table; (8)查看数据: select * from inner_table select count(*) from inner_table (9)删除表 drop table inner_table14:Hive的数据模型-分区表: (1)Partition 对应于数据库的 Partition 列的密集索引 (2)在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中 例如:test表中包含 date 和 city 两个 Partition, 则对应于date=20130201, city = bj 的 HDFS 子目录为: /warehouse/test/date=20130201/city=bj 对应于date=20130202, city=sh 的HDFS 子目录为; /warehouse/test/date=20130202/city=sh 一些相关命令 SHOW TABLES; # 查看所有的表 SHOW TABLES '*TMP*'; #支持模糊查询 SHOW PARTITIONS TMP_TABLE; #查看表有哪些分区 DESCRIBE TMP_TABLE; #查看表结构 (3)创建数据文件partition_table.dat (4)创建表 create table partition_table(rectime string,msisdn string) partitioned by(daytime string,city string) row format delimited fields terminated by '\t' stored as TEXTFILE; (5)加载数据到分区 load data local inpath '/home/partition_table.dat' into table partition_table partition (daytime='2013-02-01',city='bj'); (6)查看数据 select * from partition_table select count(*) from partition_table (7)删除表 drop table partition_table (8)alter table partition_table add partition (daytime='2013-02-04',city='bj'); 通过load data 加载数据 (9)alter table partition_table drop partition (daytime='2013-02-04',city='bj') 元数据,数据文件删除,但目录daytime=2013-02-04还在15:Hive的数据模型—桶表: (1)桶表是对数据进行哈希取值,然后放到不同文件中存储。 (2)创建表 create table bucket_table(id string) clustered by(id) into 4 buckets; (3)加载数据 set hive.enforce.bucketing = true; insert into table bucket_table select name from stu; insert overwrite table bucket_table select name from stu; (4)数据加载到桶表时,会对字段取hash值,然后与桶的数量取模。把数据放到对应的文件中。 (5)抽样查询 select * from bucket_table tablesample(bucket 1 out of 4 on id);16:Hive的数据模型-外部表: (1)指向已经在 HDFS 中存在的数据,可以创建 Partition; (2)它和 内部表 在元数据的组织上是相同的,而实际数据的存储则有较大的差异; (3)内部表 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除; (4)外部表 只有一个过程,加载数据和创建表同时完成,并不会移动到数据仓库目录中,只是与外部数据建立一个链接。当删除一个 外部表 时,仅删除该链接; CREATE EXTERNAL TABLE page_view ( viewTime INT, userid BIGINT, page_url STRING, referrer_url STRING, ip STRING COMMENT 'IP Address of the User', country STRING COMMENT 'country of origination‘ ) COMMENT 'This is the staging page view table' ROW FORMAT DELIMITED FIELDS TERMINATED BY '44' LINES TERMINATED BY '12' STORED AS TEXTFILE LOCATION 'hdfs://centos:9000/user/data/staging/page_view'; (5)创建数据文件external_table.dat (6)创建表 hive>create external table external_table1 (key string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' location '/home/external'; (7)在HDFS创建目录/home/external #hadoop fs -put /home/external_table.dat /home/external (8)加载数据 LOAD DATA INPATH '/home/external_table1.dat' INTO TABLE external_table1; (9)查看数据 select * from external_table select count(*) from external_table (10)删除表 drop table external_table17:视图操作: 视图的创建 CREATE VIEW v1 AS select * from t1;18:表的操作: (1)表的修改 alter table target_tab add columns (cols,string) (2)表的删除 drop table19:为什么选择Hive? (1)基于Hadoop的大数据的计算/扩展能力; (2)支持SQL like查询语言; (3)统一的元数据管理; (4)简单编程;20:导入数据 (1)当数据被加载至表中时,不会对数据进行任何转换。Load 操作只是将数据复制/移动至 Hive 表对应的位置。 LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE]

优秀的个人博客,低调大师

Android学习笔记(十五)——碎片的生命周期(附源代码)

碎片的生命周期 点击下载源代码 与活动类似。碎片具有自己的生命周期。理解了碎片的生命周期后。我们能够在碎片被销毁时正确地保存事实上例,在碎片被重建时将其还原到前一个状态。 1、使用上一篇的项目Fragments。在Fragment1.java文件里加入例如以下代码: package net.zenail.Fragments; import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // TODO Auto-generated method stub Log.d("Fragment 1", "onCreateView"); // 实例化布局文件 return inflater.inflate(R.layout.fragment1, container, false); } @Override public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); Log.d("Fragment 1", "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.d("Fragment 1", "onCreate"); } @Override public void onActivityCreated(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); Log.d("Fragment 1", "onActivityCreated"); } @Override public void onStart() { // TODO Auto-generated method stub super.onStart(); Log.d("Fragment 1", "onStart"); } @Override public void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d("Fragment 1", "onResume"); } @Override public void onPause() { super.onPause(); Log.d("Fragment 1", "onPause"); }; public void onStop() { // TODO Auto-generated method stub super.onStop(); Log.d("Fragment 1", "onStop"); } @Override public void onDestroyView() { // TODO Auto-generated method stub super.onDestroyView(); Log.d("Fragment 1", "onDestroyView"); } @Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d("Fragment 1", "onDestroy"); } @Override public void onDetach() { // TODO Auto-generated method stub super.onDetach(); Log.d("Fragment 1", "onDetach"); } } 2、按Ctrl+F11,将Android模拟器切换到横向模式; 3、在Eclipse中按下F11键。在模拟器上调试应用程序; 4、当应用程序载入到模拟器中后。LogCat窗体会显演示样例如以下内容: 5、单击模拟器上的Homebutton,LogCat窗体中显演示样例如以下输出: 6、在模拟器上长按Homebutton,再单击Fragments以启动应用程序,LogCat显演示样例如以下: 7、最后,单击模拟器中Backbutton,LogCat窗体显演示样例如以下输出: 8、由上面的实例可知。碎片经历的步骤例如以下: 碎片被创建时:onAttach()-->onCreate()-->onCreateView()-->onActivityCreated()。 碎片进入后台模式时:onPause()-->onStop()。 碎片变为可见时:onStart()-->onResume(); 碎片被销毁时:onPause()-->onStop()-->onDestroyView()-->onDestroy()-->onDetach(); 9、与活动一样,碎片能够使用Bundle对象在下面状态中还原碎片的实例: onCreate()、onCreateView()、onActivityCreated()。 本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5184172.html,如需转载请自行联系原作者

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册