一点一滴 - Hive
type: channel
link: http://www.edianedi.com/index.php/category/hive
description: hive
items: conda 从python3.7升级到3.9
items: HIVE UDF计算中文字数
items: hive SQL named_struct COLLECT_LIST 和排序
items: Hive-sql-日期时间戳转换
items: Json结构的表遇到脏数据
items: 如何在hive中查出的所有字段包裹整json对象
items: hive-报错
items: hive-explain执行计划详解
items: Hive优化
items: hive-命令

conda 从python3.7升级到3.9
type: item
date: 2025-02-20T12:03:06+00:00
description: 升级conda至Python 3.9的步骤介绍在本文中，我们将教会你如何将conda从Python 3.7升级到Python 3.9。conda是一个流行的包管理器，可以帮助我们管理不同版本的Python及其相关库。通过升级conda，我们可以获得最新的Python版本，以便利用其新特性和增强功能。升级流程下表展示了升级conda至Python 3.9的步骤：步骤 描述1 检查当前conda版本2 创建新的Python 3.9环境3 迁移已安装的包4 删除旧的Python 3.7环境接下来，我们将逐步介绍每个步骤并提供相应的代码示例。步骤1：检查当前conda版本在开始升级之前，我们需要检查当前conda的版本。可以使用以下命令检查：conda --version该命令会显示当前conda的版本号。步骤2：创建新的Python 3.9环境首先，我们需要创建一个新的Python 3.9环境。使用以下命令创建一个名为"python39"的环境，并指定Python版本为3.9：conda create -n python39 python=3.9该命令将在conda中创建一个新的环境，并安装Python 3.9。步骤3：迁移已安装的包在升级过程中，我们需要迁移已安装的包到新的Python 3.9环境。首先，我们需要激活新的环境，然后使用以下命令导出已安装的包列表：`conda activate python39conda list --explicit > packages.txt`该命令将导出已安装的包列表到一个名为"packages.txt"的文件中。接下来，我们需要在新的Python 3.9环境中安装这些包。使用以下命令：`conda install --name python39 --file packages.txt`该命令将根据"packages.txt"文件中的包列表，安装这些包到新的环境中。步骤4：删除旧的Python 3.7环境升级完成后，我们可以删除旧的Python 3.7环境以释放空间。首先，确保当前处于其他环境中，然后使用以下命令删除旧环境：conda remove --name python37 --all请注意，删除环境会删除该环境下所有的包和依赖项，因此请确保已经迁移了所有需要的包到新的Python 3.9环境。以上就是将conda从Python 3.7升级到Python 3.9的完整步骤。结论通过本文，我们提供了将conda升级到Python 3.9的详细步骤。首先，我们检查当前conda版本，然后创建新的Python 3.9环境。接下来，我们迁移已安装的包到新的环境，并最后删除旧的Python 3.7环境。这样，我们就成功升级了conda并获得了最新的Python版本。

HIVE UDF计算中文字数
type: item
date: 2025-02-18T11:32:46+00:00
description: import org.apache.hadoop.hive.ql.exec.UDF; import java.util.regex.Matcher; import java.util.regex.Pattern; public class CountChineseCharactersUDF extends UDF { private static final Pattern CHINESE_CHAR_PATTERN = Pattern.compile("[\\u4e00-\\u9fa5]"); public int evaluate(String str) { if (str == null) { return 0; } Matcher matcher = CHINESE_CHAR_PATTERN.matcher(str); int count = 0; while (matcher.find()) { count++; } return count; } public static void main(String[] args) { String s="小时候看泰剧，\"-->\n" + "\n"; System.out.println(new CountChineseCharactersUDF().evaluate(s)); } }

hive SQL named_struct COLLECT_LIST 和排序
type: item
date: 2025-02-18T11:29:00+00:00
description: 将数组类型的字符串按照指定的key的值进行排序 并输出select user_id, recommend_id content_id, a.title, viewpoint, content_type, audit_status, sort_json_array_and_concat(to_json(COLLECT_LIST(named_struct('pos', pos, 'item', b.title))),'pos','item') AS theme_infos, create_time from ( SELECT user_id, recommend_id, title, viewpoint, content_type, audit_status, nvl(item.topicId, '') topicId, create_time , pos FROM base1.table2 LATERAL VIEW posexplode_outer( from_json( COALESCE(theme_ids, '[]'), 'array<struct<topicId:string>>' ) ) AS pos, item WHERE day = '${day}' and to_date(create_time) >= '2025-01-20' -- and audit_status in (1, 2, 10) GROUP BY user_id, recommend_id, title, viewpoint, content_type, audit_status, topicId, create_time, pos ) a left outer join ( select subject_id, replace(title, '#', '') title from base1.table1 where day = '${day}' ) b on a.topicId = b.subject_id group by user_id, recommend_id, a.title, viewpoint, content_type, audit_status, create_time排序UDF函数import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.Text; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; @Description(name = "sort_json_array_and_concat", value = "Sort a JSON array by a given key and concatenate another key's values with commas", extended = "SELECT sort_json_array_and_concat('[{\"id\": 2, \"name\": \"Bob\"}, {\"id\": 1, \"name\": \"Alice\"}]', 'id', 'name');") public class SortJsonArrayAndConcatUDF extends UDF { public String evaluate(String jsonArrayStr, String key1, String key2) { if (jsonArrayStr == null || key1 == null || key2 == null) { return null; } try { // 解析输入的 JSON 字符串为 JSONArray JSONArray jsonArray = new JSONArray(jsonArrayStr.toString()); List<JSONObject> jsonObjects = new ArrayList<>(); for (int i = 0; i < jsonArray.length(); i++) { jsonObjects.add(jsonArray.getJSONObject(i)); } /…

Hive-sql-日期时间戳转换
type: item
date: 2024-11-14T06:19:00+00:00
description: timestamp格式 转换成 yyyyMMdd字符串select create_time,from_unixtime(unix_timestamp(create_time), 'yyyyMMdd') timestamp格式 转换成秒2024-11-29 15:58:53.798UNIX_TIMESTAMP(group_data_t.create_time)yyyyMMdd格式 月份间隔-- 定义两个日期 SELECT months_between( to_date(concat_ws('-', substr('20250214', 1, 4), substr('20250214', 5, 2), '01')), to_date(concat_ws('-', substr('20241214', 1, 4), substr('20241214', 5, 2), '01')) ) AS month_diff;毫秒时间戳转yyyyMMddfrom_unixtime(cast(cast(successtime as bigint)/1000 as bigint),'yyyyMMdd')='$day' from_unixtime(cast(eid/1000 as bigint),'yyyy-MM-dd') from_unixtime(cast(max(eid)/1000 as bigint),'yyyy-MM-dd HH:mm:ss')

Json结构的表遇到脏数据
type: item
date: 2024-07-01T02:00:00+00:00
description: hive sql中SELECT的表是json的 如:CREATE EXTERNAL TABLE `db`.`table1`( `boxsize` bigint COMMENT 'from deserializer', ****) PARTITIONED BY ( `day` string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'ignore.malformed.json'='true', 'is.datastream.json'='false') STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 'hdfs://****' 在执行查询时遇到如下报错Caused by: org.apache.hadoop.hive.serde2.SerDeException: Row is not a valid JSON Object - JSONException: Unterminated string at 1401 [character 1402 line 1]解决办法：alter table db.table1 set serdeproperties ("ignore.malformed.json" = "true");

如何在hive中查出的所有字段包裹整json对象
type: item
date: 2023-06-09T07:02:50+00:00
description: 您可以使用Hive中的内置函数to_json()将查询结果包装成一个完整的JSON对象。例如，以下查询将返回一个包含所有字段的JSON对象：SELECT to_json(struct(*)) AS json_obj FROM table_name;其中，struct(*)表示选择表中的所有列，并将它们组合成一个结构体。to_json()函数将该结构体转换为JSON格式，并将其作为名为json_obj的单个字段返回。SELECT to_json(struct(*)) AS json_obj FROM table_name;

hive-报错
type: item
date: 2020-04-13T22:56:20+00:00
description: hive运行报错2020-04-14 05:59:33,880 Stage-19 map = 11%, reduce = 0%, Cumulative CPU 310.82 sec 2020-04-14 05:59:34,111 Stage-15 map = 100%, reduce = 100%, Cumulative CPU 1259.2 sec org.apache.hadoop.yarn.exceptions.YarnRuntimeException: java.lang.InterruptedException: sleep interrupted at org.apache.hadoop.mapred.ClientServiceDelegate.invoke(ClientServiceDelegate.java:355) at org.apache.hadoop.mapred.ClientServiceDelegate.getJobStatus(ClientServiceDelegate.java:459) at org.apache.hadoop.mapred.YARNRunner.getJobStatus(YARNRunner.java:578) at org.apache.hadoop.mapreduce.Job$1.run(Job.java:323) at org.apache.hadoop.mapreduce.Job$1.run(Job.java:320) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698) at org.apache.hadoop.mapreduce.Job.updateStatus(Job.java:320) at org.apache.hadoop.mapreduce.Job.ensureFreshStatus(Job.java:310) at org.apache.hadoop.mapreduce.Job.mapProgress(Job.java:552) at org.apache.hadoop.mapred.JobClient$NetworkedJob.mapProgress(JobClient.java:237) at org.apache.hadoop.hive.ql.exec.mr.HadoopJobExecHelper.updateCounters(HadoopJobExecHelper.java:89) at org.apache.hadoop.hive.ql.exec.mr.HadoopJobExecHelper.progress(HadoopJobExecHelper.java:320) at org.apache.hadoop.hive.ql.exec.mr.HadoopJobExecHelper.progress(HadoopJobExecHelper.java:556 ) at org.apache.hadoop.hive.ql.exec.mr.ExecDriver.execute(ExecDriver.java:438) at org.apache.hadoop.hive.ql.exec.mr.MapRedTask.execute(MapRedTask.java:143) at org.apache.hadoop.hive.ql.exec.Task.executeTask(Task.java:197) at org.apache.hadoop.hive.ql.exec.TaskRunner.runSequential(TaskRunner.java:108) at org.apache.hadoop.hive.ql.exec.TaskRunner.run(TaskRunner.java:86) Caused by: java.lang.InterruptedException: sleep interrupted at java.lang.Thread.sleep(Native Method) at org.apache.hadoop.mapred.ClientServiceDelegate.invoke(ClientServiceDelegate.java:352) ... 19 more Job Sub…

hive-explain执行计划详解
type: item
date: 2019-07-21T10:33:00+00:00
description: 今天突然任务报错.运行到stage-7的时候报错。知道肯定是数据倾斜导致的,就是查不到具体哪里的问题。看yarn job的log也没发现有用的信息。https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Explain关于Hive执行计划简述 一般执行计划有两个部分： stage dependencies 各个stage之间的依赖性 stage plan 各个stage的执行计划 一个stage并不一定是一个MR，有可能是Fetch Operator，也有可能是Move Operator。 一个MR的执行计划分为两个部分： Map Operator Tree MAP端的执行计划 Reduce Operator Tree Reduce端的执行计划 一些常见的Operator： TableScan 读取数据，常见的属性 alias Select Operator 选取操作 Group By Operator 分组聚合， 常见的属性 aggregations、mode ， 当没有keys属性时只有一个分组。 Reduce Output Operator 输出结果给Reduce , 常见的属性 sort order Fetch Operator 客户端获取数据 ， 常见属性 limit 常见的属性的取值及含义： aggregations 用在Group By Operator中 count()计数 mode 用在Group By Operator中 hash 待定 mergepartial 合并部分聚合结果 final sort order 用于Reduce Output Operator中 + 正序排序 不排序 ++按两列正序排序，如果有两列 +- 正反排序，如果有两列 -反向排序 如此类推后来就通过explain看下执行计划。STAGE DEPENDENCIES: Stage-1 is a root stage Stage-2 depends on stages: Stage-1 Stage-3 depends on stages: Stage-2, Stage-17, Stage-29 Stage-37 depends on stages: Stage-3 Stage-28 depends on stages: Stage-37 Stage-27 depends on stages: Stage-21, Stage-28 , consists of Stage-36, Stage-5 Stage-36 has a backup stage: Stage-5 Stage-26 depends on stages: Stage-36 Stage-35 depends on stages: Stage-5, Stage-26 Stage-7 depends on stages: Stage-35 Stage-13 depends on stages: Stage-7 , consists of Stage-10, Stage-9, Stage-11 Stage-10 Stage-0 depends on stages: Stage-10, Stage-9, Stage-12 Stage-8 depends on stages: Stage-0 Stage-9 Stage-11 Stage-12 depends on stages: Stage-11 Stage-5 Stage-32 is a root stage , consists of Stage-16 Stage-16 Stage-30 depends on stages: Stage-16 , consists of Stage-38, Stage-17 Stage-38 has a backup stage: Stage-17 Stage-29 depends on stages: Stage-38 Stage-17 Stage-34 is a root stage , consists of Stage-21 Stage-21 STAGE PLANS: Stage: Stage-1 Map Reduce Map Operator Tree: TableScan alias: ddm_content_doc_info_logic_day Statistics: Num rows: 502133848 Data size: 209584131934 Basic stats: COMPLETE Column stats: NONE Filter Operator predicate: (((substr(d…

Hive优化
type: item
date: 2019-03-20T23:52:00+00:00
description: https://blog.csdn.net/maizi1045/article/details/53142975一、map阶段优化map端： spill(100M,80%)-->meger(压缩)参数：io.sort.mb（default100）当map task开始运算，并产生中间数据时，其产生的中间结果并非直接就简单的写入磁盘。而是会利用到了内存buffer来进行已经产生的部分结果的缓存，并在内存buffer中进行一些预排序来优化整个map的性能。每一个map都会对应存在一个内存buffer,map会将已经产生的部分结果先写入到该buffer中，这个buffer默认是100MB大小，但是这个大小是可以根据job提交时的参数设定来调整的，当map的产生数据非常大时，并且把io.sort.mb调大，那么map在整个计算过程中spill的次数就势必会降低，maptask对磁盘的操作就会变少，如果map tasks的瓶颈在磁盘上，这样调整就会大大提高map的计算性能。参数:o.sort.spill.percent（default0.80,也就是80%）map在运行过程中，不停的向该buffer中写入已有的计算结果，但是该buffer并不一定能将全部的map输出缓存下来，当map输出超出一定阈值（比如100M），那么map就必须将该buffer中的数据写入到磁盘中去，这个过程在mapreduce中叫做spill。map并不是要等到将该buffer全部写满时才进行spill，因为如果全部写满了再去写spill，势必会造成map的计算部分等待buffer释放空间的情况。所以，map其实是当buffer被写满到一定程度（比如80%）时，就开始进行spill。这个阈值也是由一个job的配置参数来控制，这个参数同样也是影响spill频繁程度，进而影响maptask运行周期对磁盘的读写频率的。但非特殊情况下，通常不需要人为的调整。调整io.sort.mb对用户来说更加方便。参数:io.sort.factor当map task的计算部分全部完成后，如果map有输出，就会生成一个或者多个spill文件，这些文件就是map的输出结果。map在正常退出之前，需要将这些spill合并（merge）成一个，所以map在结束之前还有一个merge的过程。merge的过程中，有一个参数可以调整这个过程的行为，该参数为：io.sort.factor。该参数默认为10。它表示当merge spill文件时，最多能有多少并行的stream向merge文件中写入。比如如果map产生的数据非常的大，产生的spill文件大于10，而io.sort.factor使用的是默认的10，那么当map计算完成做merge时，就没有办法一次将所有的spill文件merge成一个，而是会分多次，每次最多10个stream。这也就是说，当map的中间结果非常大，调大io.sort.factor，有利于减少merge次数，进而减少map对磁盘的读写频率，有可能达到优化作业的目的。参数:min.num.spill.for.combine（default3）当job指定了combiner的时候，我们都知道map介绍后会在map端根据combiner定义的函数将map结果进行合并。运行combiner函数的时机有可能会是merge完成之前，或者之后，这个时机可以由一个参数控制，即min.num.spill.for.combine（default3），当job中设定了combiner，并且spill数最少有3个的时候，那么combiner函数就会在merge产生结果文件之前运行。通过这样的方式，就可以在spill非常多需要merge，并且很多数据需要做conbine的时候，减少写入到磁盘文件的数据数量，同样是为了减少对磁盘的读写频率，有可能达到优化作业的目的。参数:mapred.compress.map.output(defaultfalse)减少中间结果读写进出磁盘的方法不止这些，还有就是压缩。也就是说map的中间，无论是spill的时候，还是最后merge产生的结果文件，都是可以压缩的。压缩的好处在于，通过压缩减少写入读出磁盘的数据量。对中间结果非常大，磁盘速度成为map执行瓶颈的job，尤其有用。控制map中间结果是否使用压缩的参数为：mapred.compress.map.output(true/false)。将这个参数设置为true时，那么map在写中间结果时，就会将数据压缩后再写入磁盘，读结果时也会采用先解压后读取数据。这样做的后果就是：写入磁盘的中间结果数据量会变少，但是cpu会消耗一些用来压缩和解压。所以这种方式通常适合job中间结果非常大，瓶颈不在cpu，而是在磁盘的读写的情况。…

hive-命令
type: item
date: 2018-11-28T12:22:43+00:00
description: 1.hive查看rcfile和orchive --orcfiledump /data/datawarehouse/xx/xxxx/xxxx/part-00199 hive --rcfilecat /data/datawarehouse/xx/xxxx/xxxx/part-00199