hive数据抽样的方法

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

CREATE TABLE iteblog AS SELECT * FROM iteblog1 TABLESAMPLE(1000 ROWS);
CREATE TABLE iteblog AS SELECT * FROM iteblog1 TABLESAMPLE (20 PERCENT); 
CREATE TABLE iteblog AS SELECT * FROM iteblog1 TABLESAMPLE(1M);

_

block_sample: TABLESAMPLE (n PERCENT)

该语句允许至少抽取 n% 大小的数据(注意:不是行数,而是数据大小)做为输入,仅支持 CombineHiveInputFormat ,不能够处理一些特殊的压缩格式。如果抽样失败,MapReduce 作业的输入将是整个表或者是分区的数据。由于在 HDFS 块级别进行抽样,所以抽样粒度为块大小。例如如果块大小为256MB,即使 n% 的输入仅为100MB,那也会得到 256MB 的数据。

在下面例子中 0.1% 或更多的输入数据用于查询:

SELECT *FROM source TABLESAMPLE(0.1 PERCENT) s;

如果希望在不同的块中抽取相同大小的数据,可以改变下面的参数:

set hive.sample.seednumber=;
或者可以指定要读取的总长度,但与 PERCENT 抽样具有相同的限制。(从Hive 0.10.0开始 - https://issues.apache.org/jira/browse/HIVE-3401)

block_sample: TABLESAMPLE (ByteLengthLiteral)

ByteLengthLiteral : (Digit)+ (‘b’ | ‘B’ | ‘k’ | ‘K’ | ‘m’ | ‘M’ | ‘g’ | ‘G’)
在下面例子中中 100M 或更多的输入数据用于查询:

SELECT *FROM source TABLESAMPLE(100M) s;

Hive 还支持按行数对输入进行限制,但它与上述两种行为不同。首先,它不需要 CombineHiveInputFormat,这意味着这可以在 non-native 表上使用。其次,用户给定的行数应用到每个 InputSplit 上。 因此总行数还取决于输入 InputSplit 的个数(不同 InputSplit 个数得到的总行数也会不一样)。(从Hive 0.10.0开始 - https://issues.apache.org/jira/browse/HIVE-3401)

block_sample: TABLESAMPLE (n ROWS)
例如,以下查询将从每个输入 InputSplit 中取前10行:

SELECT * FROM source TABLESAMPLE(10 ROWS);

因此如果有20个 InputSplit 就会输出200条记录。

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

分桶表抽样 (Smapling Bucketized Table)
利用分桶表,随机分到多个桶里,然后抽取指定的一个桶。
语法:

table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])

TABLESAMPLE 子句允许用户编写对抽样数据的查询,而不是对整个表格进行查询。TABLESAMPLE 子句可以添加到任意表中的 FROM 子句中。桶从1开始编号。colname 表明在哪一列上对表的每一行进行抽样。colname 可以是表中的非分区列,也可以使用 rand() 表明在整行上抽样而不是在单个列上。表中的行在 colname 上进行分桶,并随机分桶到编号为1到y的桶上。返回属于第x个桶的行。下面的例子中,返回32个桶中的第3个桶中的行,s 是表的别名:

SELECT * FROM source TABLESAMPLE(BUCKET 3 OUT OF 32 ON rand()) s;

通常情况下,TABLESAMPLE 将扫描整个表并抽取样本。但是,这并不是一种有效率的方式。相反,可以使用 CLUSTERED BY 子句创建该表,表示在该表的一组列上进行哈希分区/分簇。如果 TABLESAMPLE子 句中指定的列与 CLUSTERED BY 子句中的列匹配,则 TABLESAMPLE 仅扫描表中所需的哈希分区。

所以在上面的例子中,如果使用 CLUSTERED BY id INTO 32 BUCKETS 创建表 source(根据id将数据分到32个桶中):

TABLESAMPLE(BUCKET 3 OUT OF 16 ON id)

会返回第3个和第19个簇,因为每个桶由(32/16)= 2个簇组成(创建表时指定了32个桶,会对应32个簇)。为什么选择3和19呢,因为要返回的是第3个桶,而每个桶由原来的2个簇组成,3%16=3 19%16=3,第3个桶就由原来的第3个和19个簇组成。
另一个例子:

TABLESAMPLE(BUCKET 3 OUT OF 64 ON id)

会返回第三个簇的一半,因为每个桶将由(32/64)= 1/2个簇组成。

再一个例子:随机分到10个桶,抽取第一个桶。

CREATE TABLE iteblog AS SELECT * FROM iteblog1 TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());

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

随机抽样
原理:利用 rand() 函数进行抽取,rand() 返回一个0到1之间的 double 值。

使用方法一
CREATE TABLE iteblog AS
SELECT * FROM iteblog1
ORDER BY rand()
limit 10000
此时,可以提供真正的随机抽样,但是,需要在单个 reducer 中进行总排序,速度慢。

使用方法二
CREATE TABLE iteblog AS
SELECT * FROM iteblog1
SORT BY rand()
limit 10000
Hive 提供了 sort by,sort by 提供了单个 reducer 内的排序功能,但不保证整体有序,上面的语句是不保证随机性的。

使用方法三
CREATE TABLE iteblog AS
SELECT * FROM iteblog1
where rand()<0.002
distribute by rand()
sort by rand()
limit 10000;
where 条件首先进行一次 map 端的优化,减少 reducer 需要处理的数据量,提高速度。distribute by 将数据随机分布,然后在每个 reducer 内进行随机排序,最终取10000条数据(如果数据量不足,可以提高 where 条件的 rand 过滤值)。
缺点:速度慢

使用方法四
CREATE TABLE iteblog AS
SELECT * FROM iteblog1
where rand()<0.002
cluster by rand()
limit 10000;
cluster by 的功能是 distribute by 和 sort by 的功能相结合,distribute by rand() sort by rand() 进行了两次随机,cluster by rand() 仅一次随机,所以速度上会比上一种方法快。
随机结果里面添加分区
上面的几种方法会丢失掉分区信息,我们可以结合动态分区将分区信息加到结果集中,具体如下:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
 
INSERT INTO TABLE iteblog partition(thedate) 
SELECT * FROM iteblog1 TABLESAMPLE (BUCKET 1 OUT OF 10 ON rand());
### 回答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、付费专栏及课程。

余额充值