hive自定义udf函数,在udf函数内怎么读取hive表数据

hive自定义udf函数,在udf函数内怎么读取hive表数据,第1张

如何用sqoop将hive分区表信息导入到mysql命令

直接导入hive表

sqoop import --connect jdbc:postgresql://ip/db_name--username user_name --table table_name --hive-import -m 5

内部执行实际分三部,1将数据导入hdfs(可在hdfs上找到相应目录),2创建hive表名相同的表,3,将hdfs上数据传入hive表中

sqoop根据postgresql表创建hive表

sqoop create-hive-table --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-table hive_table_name( --hive-partition-key partition_name若需要分区则加入分区名称)

导入hive已经创建好的表中

sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --table table_name --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);

使用query导入hive表

sqoop import --connect jdbc:postgresql://ip/db_name --username user_name --query "select , from retail_tb_order where \$CONDITIONS" --hive-import -m 5 --hive-table hive_table_name (--hive-partition-key partition_name --hive-partition-value partititon_value);

注意:$CONDITIONS条件必须有,query子句若用双引号,则$CONDITIONS需要使用\转义,若使用单引号,则不需要转义。

1 hive如何通过insert语句将数据插入表中

从文件加载数据进表(OVERWRITE覆盖,追加不需要OVERWRITE关键字)

LOAD DATA LOCAL INPATH 'dim_csl_rule_configtxt' OVERWRITE into table dimdim_csl_rule_config;

--从查询语句给table插入数据

INSERT OVERWRITE TABLE test_h02_click_log PARTITION(dt) select

from stages_h02_click_log where dt='2014-01-22' limit 100;

2 如何将excel中的数据导入hive仓库中

将存放在excel表中的数据如何导入到hive中,首先前提是excel表中数据类型以及长度要和hive仓库中表的字段属性一致,否则会报异常。其次因为建表的时候,已经定义了表的分割符号(row format delimited fields terminated by ','),所以不能直接将excel表格中数据导入的hive仓库中。处理方式如下:

先将excel表中数据另存转化为datacsv格式,转化为csv格式的文件默认就是用“,”进行分割的,可以用notepad++打开datacsv格式查看。然后再讲数据导入到hive仓库中即可。但是执行如下导入语句时,发现报错,显示Wrong file format。

检查以后发现,因为在创建表格时,使用的是RCFILE存储格式

STORED AS INPUTFORMAT 'orgapachehadoophiveqlioRCFileInputFormat'

OUTPUTFORMAT 'orgapachehadoophiveqlioRCFileOutputFormat'

而导入到是TextFile文件格式,所以报错,解决办法建表的格式默认使用TextFile格式即可。

如何将文件转化为rcfile文件格式:

(1)hive 中直接 通过textfile表进行insert转换,比如通过如下将textfile数据导入到rcfile中。

insert overwrite table _RCTable partition(dt='2013-09-30') select p_id,tm,idate,phone from tmp_testp where dt='2013-09-30';

(2)使用mapreduce将普通的文件压缩成RCFile,并且再读取RCFile文件。

3 如何把hive导出到本地的表导入mysql中

MySQL命令行导出数据库:

1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录

如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 41\bin

(或者直接将windows的环境变量path中添加该目录)

2,导出数据库:mysqldump -u 用户名 -p 数据库名 >; 导出的文件名

如我输入的命令行:mysqldump -u root -p news > newssql (输入后会让你输入进入MySQL的密码)

(如果导出单张表的话在数据库名后面输入表名即可)

3、会看到文件newssql自动生成到bin文件下

命令行导入数据库:

1,将要导入的sql文件移至bin文件下,这样的路径比较方便

2,同上面导出的第1步

3,进入MySQL:mysql -u 用户名 -p

如我输入的命令行:mysql -u root -p (输入同样后会让你输入MySQL的密码)

4,在MySQL-Front中新建你要建的数据库,这时是空数据库,如新建一个名为news的目标数据库

5,输入:mysql>use 目标数据库名

如我输入的命令行:mysql>use news;

6,导入文件:mysql>source 导入的文件名;

如我输入的命令行:mysql>source newssql;

4 Hive几种数据导入方式和动态分区,多表插入

常用的的有三种:1从本地文件系统中导入数据到Hive表;2从HDFS上导入数据到Hive表;3在创建表的时候通过从别的表中查询出相应的记录并插入到所创建的表中。

Hive配置:HDFS中Hive数据文件存放目录(启动hive后HDFS自动创建):HDFS: /usr/hive/warehousehadoop fs -mkdir /usr/hive/warehouse 命令创立本地数据存放目录:本地:/home/santiago/data/hive一从本地文件系统中导入数据到Hive表1在hive中建表hive> show databases;OKdefaultTime taken: 1706 seconds, Fetched: 1 row(s)hive> create table guo_test(Name string,String string)> row format delimited> fields terminated by ','> stored as textfile;hive> show tables;OKguo_testTime taken: 0024 seconds, Fetched: 1 row(s)1234567891011122在本地文件建立同类型数据表santi@hdp:~/data/hive$ lshive_testtxtsanti@hdp:~/data/hive$ cat hive_testtxtsanti,you are a zhazha12343导入数据并测试hive>load data local inpath '/home/santi/data/hive/hive_testtxt' into table guo_test;hive> select from guo_test;hive>dfs -ls /usr/hive/warehouse/guo_test;#hadoop fs -ls /usr/hive/warehouseFound 1 itemsdrwxrwxr-x - santiago supergroup 0 2017-01-14 21:13/usr/hive/warehouse/guo_test12345678发现hive-site,xml设置的HDFS文件存储位置中多了guo_test这个文件夹#hadoop fs -ls /usr/hive/warehouse/guo_testFound 1 items-rwxrwxr-x 1 santiago supergroup 24 2017-01-14 21:13/usr/hive/warehouse/guo_test/hive_testtxthive> select from guo_test;OKsanti you are a zhazha12345678在该文件夹中找到了所写入hive数据仓库的文件。[注]本地数据写入成功,但是从本地将数据导入到Hive表的过程中,其实是先将数据临时复制到HDFS的一个目录下(典型的情况是复制到上传用户的HDFS home目录下,比如/home/santi/),然后再将数据从临时目录下移动到对应的Hive表的数据目录里面(临时目录不保留数据)。

二从HDFS文件系统中导入数据到Hive表1在HDFS文件系统上建立数据文件hdfs上没有vim命令,则需要将本地数据文件手动传入到HDFS上/data/hive# vim data_HDtoHive/data/hive# cat data_HDtoHivedata from, HDFS to Hive #hadoop fs -put /home/santi/data/hive/data_HDtoHive /usr/data/input数据传入# hadoop fs -ls /usr/data/input123452导入数据hive> load data inpath '/usr/data/input/data_HDtoHive' into table guo_test;hive> select from guo_test;OKdata from HDFS to Hivesanti you are a zhazhaTime taken: 0172 seconds, Fetched: 2 row(s)123456数据写入成功数据存hive配置的数据存储位置中。[注]从本地导入数据语句为hive>load data local inpath '/home/santi/data/hive/hive_testtxt' into table guo_test;从HDFS中导入数据的语句为hive> load data inpath '/usr/data/input/data_HDtoHive' into table guo_test;差距在local这个命令这里。

而从HDFS系统上导入到Hive表的时候,数据转移。HDFS系统上查找不到相关文件。

三从HIVE表选取数据插入新的HIVE表命令为create table 表名 as selecr xxx from 表名。hive> create table hivedata_test1> as> select name> from guo_test;hive> select from hivedata_test1;OKdata fromsantiTime taken: 0116 seconds, Fetched: 2 row(s)123456789[注]hive是分区表有稍微区别在Hive中,表的每一个分区对应表下的相应目录,所有分区的数据都是存储在对应的目录中。

比表有a和b两个分区,则对应a=xxx,b=xx对应表的目录为/user/hive/warehouse/a=xxxuser/hive/warehouse/b=xx,所有属于这个分区的数据都存放在这个目录中。hive> create table hivedata_test2(> Name string)> partitioned by> (String string)> ROW FORMAT DELIMITED> FIELDS TERMINATED BY ','> STORED AS TEXTFILE;hive> insert into table hivedata_test2> partition(String='best')> select Name> from guo_test;hive> select from hivedata_test2;OKdata from bestsanti bestTime taken: 1549 seconds, Fetched: 2 row(s)# hadoop fs -ls /usr/hive/warehouse/hivedata_test2Found 1 itemsdrwxrwxr-x -santiago supergroup 0 2017-02-14 17:40/usr/hive/warehouse/hivedata_test2/string=best。

5 hive 怎么添加 表注释语法

要添加注释,只需要用单引号'作为注释文字的开头。注释符告诉Visual Basic,忽略这个符号后面的内容,这些内容就是代码段中的注释部分,在代码编辑器中以绿色字符显示。

注释可以和语句在同一行,写在语句的后面,也可占据一整行。

例如:

'在文本框中放欢迎词。

Private Sub mand1_Click()

Text1 Text="Hello" '把文本框Text1的属性设置为Hello。

End Sub

注意,不能在同一行上把注释接在续行符后面。

hive 分区表:

分区字段的物理表现:

hive分区表 ,其真实的表现其实就是在 存储hive表的文件夹的下面,创建新的文件夹,

文件夹的名字是 分区字段=字段取值 这种格式的。

分区的优点:

当分区表的数据很大的时候,可以指定查询表格之中的部分数据。

设置表格分区字段需要的注意点:

1:分区字段的取值不要很多,因为这样会造成表的文件夹的下面会出现很多的小的文件夹

2: 一般可以将sql之中 where 之中出现的字段作为 分区的字段。(可以当作分区字段选取的一个参考)

查看表格是否是分区表:

desc formatted table_name

分区表的话 ,会有Partition Information

向分区表插入数据:

情况分为:

1:向表格之中插入数据,明确指定插入的分区的名字

2:向表格之中插入数据,不明确指定插入的数据的名字,而是根据插入的数据的某个字段的取值来自动决定数据

被插入到哪一个分区之中。被称为动态分区。

如何开启hive 动态分区的功能?

set  hiveexecdynamicipartition=true;

hive 动态分区:有两种模式:

严格模式 和非严格模式

严格模式:

动态分区的时候,必须有一个分区是静态的。

非严格模式,对分区是否是静态的不在意。

如何设置 动态分区的模式?

set hiveexecdynamicpartitionmode=nostrict

默认的模式是strict 严格模式。

插入数据时 明确指定需要插入的分区的值:

sql demo :

1:load data [local] inpath 'path' into table xxx partition(partition_fields partiton_type)

2:insert into table table_a partition(partition_fields partition_type)

select from table_b [];

使用insert 的时候 ,需要注意前后表的表的字段数目是匹配的,

如果表的前后字段是不匹配的话,那么就是会报错。

向分区表之中插入数据的时候,根据数据的某个字段的值,来创建分区,

以及决定数据被插入到哪一个分区之中。

sql demo:

对一个分区 进行动态分区:

首先要设置两个参数:

set  hiveexecdynamicipartition=true;

set hiveexecdynamicpartitionmode=nostrict

然后就是可以使用动态分区了。

分区值的推断,是根据后面查询的最后字段来决定的,只有一个分区,

那么就是查询的最后一个字段,如果是两个,那么就是从后往前的字段进行匹配。

insert into table pp partition(`date`) select name,age,`date` from par;

这里的sql demo 

是将par 的`date` 字段 作为pp表之中 `date`分区的取值。

部分动态分区:

就是多个分区,但是前面的分区的取值是取静态的,然后后面的分区的取值是未定的。

类似于 partition(country='china',city)

这里需要注意的是顺序,静态分区在前面,动态分区在后面。

然后就是多个分区,完全的动态分区:

完全动态分区的时候,就是使用后面select 查询的表进行分区数据的匹配。

动态分区在实际使用的时候会遇到的问题:

动态分区的一个使用场景:

首先加载数据到一个表格a之中,然后将这个表格之中再次转化到另外一个

表格b之中,表a转化到表b的时候,使用动态分区。

因为直接使用load 加载数据的时候,对于分区表而言,加载数据只能指定固定的分区名,

无法使用动态分区来加载数据。

相应的问题就是:

如果a表本身含有很多的文件,那么使用动态分区的时候,

那么在b表的时候,就是会产生很多的小文件。

原因如下:

如果 a表之中数据文件是200个,

那么动态分区的时候,可能会产生200个map,

然后一个map包含的数据之中,可能有多个分区的取值,

所以一个map 会产生多个文件。

所以后果就是,在新的b表之中的每个分区下面,会产生很多的小文件。

总结来说:不好的影响就是可能会产生很多的小文件。

解决的方式:

因为动态分区转化成为的mapredue job 是没有reduce,所以数目不好控制,

所以可以采用的方式,就是手动增加reduce的数目,

可以使用distributed by 来增加 reduce的数目。

insert into table table_a partition('partition_name')

select   from table_b

dirtribute by partitoin_name

但是这样的方式,就是可能导致 reduce之间包含的数据量的不均匀。

所以解决的方法就是:

distribute by rand()

使用hash 随机分区,这样的方式,来讲数据均匀分配到reduce之中。

然后每个reduce 会产生 分区取值数目的文件,

例子: reduce数目为 200 分区的取值数位24

那么最后产生的文件的数目就是 200 24个文件。

其实可以通过exlpain 来解析sql的执行计划,这样的话,

可以看出是否具有reduce *** 作。

查询表的分区信息:

show partitions table_name

向分区表之中增加分区:

alter table table_name add partition(pfield=pvalue,)

如果表格之中有多个分区的话,那么增加分区的时候,也是多个分区

一同增加的。

删除分区:

alter table table_name drop partition(pfield=pval)

分区信息修改:

分区信息的修改分为 分区名的修改 和 分区数据的修改 两种

分区名的修改

alter table table_name partition(pfield=pvalue) rename to partition(pfield=pvalue)

分区数据的修改:

alter table table_name partition(pfield=pvalue) set location 'data_location'

以上就是关于hive自定义udf函数,在udf函数内怎么读取hive表数据全部的内容,包括:hive自定义udf函数,在udf函数内怎么读取hive表数据、HiveQL SELECT语句查询、Hive sql及窗口函数等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/web/9823245.html

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

发表评论

登录后才能评论

评论列表(0条)

保存