hive,hdfs , mysql

本文介绍如何使用Cloudera Manager通过Hive SQL语句从本地或HDFS导入数据,并讲解了表与分区表的创建方法、动态分区的应用及UDF与UDAF函数的编写技巧。

将本地文件导入hive中

本人用的是Cloudera Manager , 用的虚拟机,开了8G还是不行, 所以虚拟机不开10 G 估计真的很难用
导包前我们先建表

建表语句

create table order_mulit_partition(order_number string,event_time string)
PARTITIONED BY(event_month string, step string) 
row format delimited 
fields terminated by '\t';

order_mulit_partition 是表名

order_number string,event_time string 这是两个参数 前面为字段名, 后面为字段类型
PARTITIONED BY(event_month string, step string) 这边是分区,分区可以加快查询速度
row format delimited 支持多行插入
fields terminated by ‘\t’;字段之间支持制表符分割

插入文件


从本地导入文件

load data local inpath '/usr/local/test/order_created.txt' overwrite into table order_mulit_partition 
PARTITION(event_month='201903', step='1');

从hdfs 导入文件

load data  inpath '/usr/local/test/order_created.txt' overwrite into table order_mulit_partition 
PARTITION(event_month='201903', step='1');

hive与hdfs的对应

笔者 导入了两次 event_month是一样的 step 分别为1和2
有一种说法是导入了hive 就是导入了hdfs中 。为什么这么说 请看上图, 我只运行了导入文件到hive的表中,可是hadoop 下面也生成了 对应的文件。具体可以看/user/hive/warehouse/下面, 因为分区的关系所以这个order_mulit_partition下面还是有文件。分区的好处也体现在这里了,能够将记录分类减少过滤的时间。

在hive 表中的记录如下所示
在这里插入图片描述

动态分区

建表

create table order1(order_number string,event_time string)
PARTITIONED BY(event_month string, step string) 
row format delimited 
fields terminated by '\t';

注意这句一定要先运行


 set hive.exec.dynamic.partition.mode=nonstrict;
 set hive.exec.dynamic.partition=true;

从一张表导入到宁外一张表

from order_mulit_partition
insert into table order1
partition(event_month,step)
select order_number, event_time,event_month,step;

UDF 函数编写


package HiveUDF.HiveUDF;

import org.apache.hadoop.hive.ql.exec.UDF;

/**
 * Hello world!
 *
 */
public class App extends UDF {

	/*public static void main(String[] args) {
		// TODO Auto-generated method stub
	}*/

	public int evaluate(int a, int b) {
		return a + b;// 计算两个数之和
	}

	// 重载
	public String evaluate(String input) {
		return input.toLowerCase();// 将大写字母转换成小写
	}
	
	public String evaluate(String a,String b) {
		return a+b;// 将大写字母转换成小写
	}
	
	
	
}


所有的名字都叫evaluate,因为在hive 中 运行的是udf 的重载方法evaluate

在hive 界面运行 add jar /usr/local/fuchanghai/HiveUDF.jar

再创建函数 create temporary function addValue as ‘HiveUDF.HiveUDF.App’;
HiveUDF.HiveUDF.App 是上面的包名+类名 不对的话 会报错 找不到
在这里插入图片描述
电脑内存不够卡死 运行不出来

UDAF


package HiveUDF.HiveUDF;

import java.util.HashMap;
import java.util.Map;

import org.apache.hadoop.hive.ql.exec.UDAF;
import org.apache.hadoop.hive.ql.exec.UDAFEvaluator;

public class UDAFTest  extends UDAF{
	public static class Evaluator implements UDAFEvaluator{

		//存放不同学生的总分
	       private static Map<String,Integer> ret;
	 
	       public Evaluator()
	       {
		   super();
	           init();
	       }
	 
	       //初始化
	       public void init()
	       {
		  ret = new HashMap<String,Integer>();
	       }
	       //reduce
	       //map阶段,遍历所有记录
	       public boolean iterate(String strStudent,int nScore)
	       { 
	    	 
	         if(ret.containsKey(strStudent))
	         {
	            int nValue = ret.get(strStudent);
	            nValue +=nScore;
	            ret.put(strStudent,nValue);
	         }
	         else
	         {
	           ret.put(strStudent,nScore);
	         }
	         return true;
	       }
	    
	       //返回最终结果 
	       public Map<String,Integer> terminate()
	       {
	         return ret;
	       }
	 
	       //combiner阶段,本例不需要  hadoop mapreduce  combiner
	       public Map<String,Integer> terminatePartial() 
	       {
	          return ret;
	       }
	 
	       //reduce阶段   将同key 放入同一个JOB
	       public boolean merge(Map<String,Integer> other)
	       {
	            for (Map.Entry<String, Integer> e : other.entrySet()) {
	                ret.put(e.getKey(),e.getValue());
	            }
	            return true;
	       }
		
	}

}


运行 select 函数名(studentNum , score )from 表名

sqoop

简单的语法
from mysql to hdfs

import
--connect
jdbc:mysql://cm1:3306/mysql
--username
root
--password
123456
--table
db
--target-dir
/user/sqoop/aa
--where
"Db='scm'"
--num-mappers
1
--null-string
'0'
--null-non-string
'0'

sqoop --options-file ./test.opt

### HiveHDFS 在数据仓库中的作用 Hive 是建立在 Hadoop 基础之上的数据分析工具,它依赖于 Hadoop 分布式文件系统 (HDFS) 来存储和管理大规模数据集[^1]。HDFS 提供了一个高可用性和高吞吐量的分布式存储解决方案,能够有效地处理海量数据的读写操作。 #### 数据存储位置 Hive 的数据默认存储在 HDFS 的特定路径下,通常是 `/user/hive/warehouse` 或者由配置参数 `hive.metastore.warehouse.dir` 指定的其他目录[^4]。每个 Hive 表对应 HDFS 中的一个目录,而表中的分区则会形成该目录下的子目录结构。此外,Hive 支持多种存储格式,例如 TextFile、ORC、Parquet 等,这些文件会被实际存储在 HDFS 上的不同节点中[^2]。 #### 工作原理 Hive 查询语言(HiveQL)允许用户通过类 SQL 的语法来执行复杂的数据分析任务。当用户提交一个 Hive 查询时,Hive 驱动程序会解析并优化查询计划,随后将其转化为底层的 MapReduce 或 Tez 作业,在 Hadoop 集群上运行[^1]。在此过程中,Hive 利用 Metastore 存储有关表结构、列定义以及分区信息的元数据,这些元数据通常保存在一个独立的关系型数据库(如 MySQL)中[^3]。 ### HiveHDFS 的交互方式 HiveHDFS 的交互主要体现在以下几个方面: 1. **数据存储** Hive 将所有的数据都存储在 HDFS 上,并按照一定的规则组织成目录层次结构。例如,对于一张带有分区的表,HDFS 中会有对应的子目录表示不同的分区。 2. **数据访问** 当 Hive 执行查询时,它会根据元数据定位目标数据所在的 HDFS 路径,并通过 HDFS API 加载所需的数据块进行计算[^3]。 3. **数据格式支持** Hive 可以灵活地选择不同类型的文件作为输入输出格式,比如纯文本文件(TextFile)、二进制序列化文件(SequenceFile),甚至是高度压缩的 ORC 和 Parquet 文件。这种灵活性得益于 SerDe(Serializer/Deserializer)机制,它可以将外部数据源映射为内部 Java 对象以便进一步处理[^4]。 ```sql -- 创建一个使用 ORC 格式的表 CREATE TABLE example_table ( id INT, name STRING ) STORED AS ORC; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值