hive 数据清洗与抽样与查看函数使用方法

创建表并加载数据

hive>create table UserTest(
user_id       string,
card_id       string,
type          string,
`timestamp`   bigint
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

hive>load data local inpath '/root/test.csv' into table UserTest;    #//本地加载数据
或者
hive>load data  inpath '/xxx/test.csv' into table UserTest;    #//hdfs加载数据

抽样方法与优缺点:

1. 块抽样 (Block Sampling) : Hive 本身提供了抽样函数,使用 TABLESAMPLE 抽取指定的 行数/比例/大小

CREATE TABLE test AS SELECT * FROM DataTable tablesample(1000 ROWS); -- 数字与 rows 之间要有空格
CREATE TABLE test AS SELECT * FROM DataTable tablesample(20 PERCENT); -- 数字与 percent 之间要有空格
CREATE TABLE test AS SELECT * FROM DataTable tablesample(1M); -- 数字与 M 之间不要有空格

缺点 : 不随机。该方法实际上是按照文件中的顺序返回数据,对分区表,从头开始抽取,可能造成只有前面几个分区的数据
优点 : 速度快

2.分桶表抽样 (Smapling Bucketized Table) : 利用分桶表,随机分到多个桶里,然后抽取指定的一个桶。举例 : 随机分到10个桶,抽取第一个桶

hive>CREATE TABLE test AS
SELECT *
FROM DataTable
tablesample(BUCKET 1 OUT OF 10 ON rand());

优点 : 随机,测试发现,速度比方法 3 的 rand() 快

3. 随机抽样 (Random() Sampling) : 利用 rand() 函数进行抽取,rand() 返回一个0到1之间的 double 值
使用方法1> 提供真正的随机抽样,但是,需要在单个 reducer 中进行总排序,速度慢

hive>CREATE TABLE test AS
SELECT * FROM DataTable
ORDER BY rand()
LIMIT 10000

使用方法2> Hive 提供 sort by,sort by 提供了单个 reducer 内的排序功能,但不保证整体有序,下面的语句是不保证随机性的

hive>CREATE TABLE test AS
SELECT * FROM DataTable
SORT BY rand();

使用方法3> WHERE条件首先进行一次 map 端的优化,减少 reducer 需要处理的数据量,提高速度。DISTRIBUTE BY 将数据随机分布,然后在每个 reducer 内进行随机排序,最终取 10000条数据 (如果数据量不足,可以提高 where 条件的 rand 过滤值)

hive>CREATE TABLE test AS
SELECT * FROM DataTable
WHERE rand()<0.002
DISTRIBUTE BY rand()
SORT BY rand()
LIMIT 10000;

缺点 : 速度慢

使用方法4> cluster by 的功能是 distribute by 和 sort by 的功能相结合,DISTRIBUTE BY rand() SORT BY rand() 进行了两次随机,CLUSTER BY rand() 仅一次随机,所以速度上会比上一种方法快

hive>CREATE TABLE test AS
SELECT * FROM DataTable
WHERE rand()<0.002
CLUSTER BY rand()
LIMIT 10000;

随机结果里面添加分区 : 上面的几种方法会丢失掉分区信息,可以结合动态分区将分区信息加到结果集中

hive>SET hive.exec.dynamic.partition=true;
hive>SET hive.exec.dynamic.partition.mode=nonstrict;

hive>INSERT INTO TABLE test partitin(thedate)
SELECT *
FROM DataTable
TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());


实例:

抽样:

--获取样品时间100M的

hive>CREATE TABLE UsertTest_100 AS SELECT * FROM UsertTest TABLESAMPLE(100M);

数据清洗:

--检查空值
-- 查看源数据是否存在空值

hive>SELECT user_id,card_id,type,`timestamp`
FROM UserTest_100
WHERE user_id IS NULL OR card_id IS NULL OR type IS NULL
OR `timestamp` IS NULL;

--检查用户行为是否异常
-- 查看用户行为是否都是buy,fav

hive>SELECT * FROM UserTest_100
WHERE type NOT IN ('buy','fav');

--查看时间范围

hive>select from_unixtime(min(`timestamp`)),from_unixtime(max(`timestamp`)) from UsertTest_100;

--结果说明这份数据库的时间范围,
--要分析的范围是2023-02-01到2023-02-03,下面确认这两个日期范围对应的时间戳:

-- 筛选有效时间范围2023年2月1日至2023年2月3日

SELECT UNIX_TIMESTAMP('2023-02-01 00:00:00')

-- 结果为1675180800

SELECT UNIX_TIMESTAMP('2023-02-03 23:59:59')

-- 结果为1675439999

--选取有效范围的记录

create table demo(
user_id       string,
card_id       string,
type          string,
ts            bigint
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

INSERT INTO demo
SELECT * FROM UserTest_100
WHERE `timestamp` BETWEEN 1675180800 AND 1675439999
;

--去重  id 和 ts 相同的(去重 用group by或者row_number)

hive>with temp as(
select user_id,card_id,type,ts, row_number() over(partition by user_id,type,ts order by user_id,type,ts) as rn
from demo
),
result as(
select user_id,card_id,type,ts
from temp where rn=1
)
select count(1) from result;

--动态分区

hive>create table demo_partition
(
user_id       string,
card_id       string,
type          string,
datestr       string
)
partitioned by (dt string)
row format delimited
fields terminated by ','

--设置动态分区

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

hive>insert into demo_partition partition (dt)
select
user_id,
card_id,
type,
from_unixtime(ts,'yyyy-MM-dd') as datestr,
from_unixtime(ts,'yyyy-MM-dd') as dt
from demo;

--创建表在数据库demo中:

hive>create table UserT(
user_id       string,
card_id       string,
type          string,
ts            bigint
)
stored as orc;


hive>INSERT INTO UserT
SELECT * FROM UserTest
WHERE `timestamp` BETWEEN  1675180800 AND 1675439999;

--随机抽取20万条记录

hive>create table UserT_demo(
user_id       string,
card_id       string,
type          string,
ts            bigint
)
stored as orc;

hive>insert into UserT_demo
SELECT * FROM UserT
cluster by rand()  
limit 200000;

--动态分区 利用动态分区按天进行分区

hive>create table demo_partition
(
user_id       string,
card_id       string,
type          string,
datestr       string
)
partitioned by (dt string)
stored as orc;

--设置动态分区

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

hive>insert into demo_partition partition (dt)
select
user_id,
card_id,
type,
from_unixtime(ts,'yyyy-MM-dd') as datestr,
from_unixtime(ts,'yyyy-MM-dd') as dt
from UserT_demo;

---查出分区

hive>show partitions demo_partition;

查看函数使用方法:

---查看month 相关的函数

hive>show functions like '*month*'

---查看  add_months 函数的用法

hive>desc function add_months;

--查看 add_months 函数的详细说明并举例

hive>desc function extended add_months;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Hive 是一个基于 Hadoop数据仓库工具,可以用于存储、管理和分析大规模数据集。Hive 提供了 SQL-like 的查询语言 HiveQL,可以方便地对存储在 Hadoop 中的数据进行查询和分析。下面是一些常用的 Hive 数据清洗方法: 1. 数据去重:使用 DISTINCT 关键字对数据进行去重。 2. 数据过滤:使用 WHERE 子句对数据进行过滤,例如:WHERE column_name='value'。 3. 数据填充:使用 IFNULL 函数或 CASE 表达式对空值进行填充,例如:IFNULL(column_name, 'default_value')。 4. 数据转换:使用 CAST 函数数据类型进行转换,例如:CAST(column_name AS int)。 5. 数据拆分:使用 SUBSTR 函数对字符串进行拆分,例如:SUBSTR(column_name, start_index, length)。 6. 数据合并:使用 CONCAT 函数对字符串进行合并,例如:CONCAT(column_name1, column_name2)。 7. 数据聚合:使用 GROUP BY 子句对数据进行聚合,并使用 AVG、SUM、MAX、MIN 等函数进行计算,例如:SELECT column_name, AVG(column_name2) FROM table_name GROUP BY column_name。 8. 数据排序:使用 ORDER BY 子句对数据进行排序,例如:SELECT column_name FROM table_name ORDER BY column_name ASC。 9. 数据抽样使用 TABLESAMPLE 子句对数据进行抽样,例如:SELECT column_name FROM table_name TABLESAMPLE(10 PERCENT)。 以上是一些常用的 Hive 数据清洗方法,可以根据具体需求进行选择和组合使用。 ### 回答2: Hive数据清洗是指通过Hive语句和函数数据进行处理和过滤,以得到符合要求的数据。具体方法如下: 1. 选择合适的列: 首先,根据需求选择需要进行数据清洗的列。可以使用Hive的SELECT语句查询表中所有列,并根据需求筛选出需要清洗的列。 2. 过滤无效数据: 如果数据中存在无效或错误的记录,可以使用Hive的WHERE语句进行过滤。根据数据的特点,使用相应的逻辑操作符(如“=”、“!=”、“>”、“<”等)进行条件筛选,排除无效的记录。 3. 处理缺失值: 如果数据中存在缺失值,可以使用Hive的COALESCE函数或IFNULL函数将缺失值替换为指定的默认值。 4. 去除重复记录: 如果数据中存在重复记录,可以使用Hive的DISTINCT关键字去除重复记录。 5. 数据类型转换: 如果数据中的某些列的数据类型与要求不符,可以使用Hive的CAST函数数据转换为目标数据类型。 6. 数据格式化: 如果数据中的某些列的数据格式不符合要求,可以使用Hive的正则表达式函数(如REGEXP_EXTRACT、REGEXP_REPLACE等)进行数据格式化。 7. 数据标准化: 如果数据中包含不规范的文本(如大小写混合、拼写错误等),可以使用Hive的字符串函数(如LOWER、UPPER、TRIM等)对文本进行标准化操作。 8. 处理异常值: 如果数据中存在异常值,可以使用Hive的CASE WHEN语句对异常值进行处理,即根据条件将异常值替换为正确的值。 综上所述,Hive数据清洗的具体方法包括选择合适的列、过滤无效数据、处理缺失值、去除重复记录、数据类型转换、数据格式化、数据标准化和处理异常值等操作。通过运用Hive的相关语句和函数,可以有效地清洗数据,得到符合要求的数据集。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值