Hive中的外部表
对于Hive中的外部表来说,因为表是外部的,Hive认为其并不拥有这份数据,删除该表并不会真正删除其中的数据,其中的表描述元信息会被删除掉。
对数据进行分区后,对于管理表,可以将其显示在hdfs目录中,但是外部表目录中不会真正存在数据,只能通过show partitions命令来显示外部表的分区信息。
我们的外部表是通过dateid进行的partition,如何显示某个partition外部表对应的location:
hive -e "describe extended xxx partition (dateid=20141230)"
显示出来的信息大致如下:
field1 string dateid string # Partition Information # col_name data_type comment dateid string Detailed Partition Information Partition(values:[20141230], dbName:logbase_db, tableName:logbase, createTime:1419984079, lastAccessTime:0, sd:StorageDescriptor(cols:[FieldSchema(name:doc, type:string, comment:null), FieldSchema(name:dateid, type:string, comment:null)], location:hdfs://ns1/xxx/20141230, inputFormat:com.inputformat.XXXInputFormat, outputFormat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, parameters:{serialization.format=1}), bucketCols:[], sortCols:[], parameters:{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), storedAsSubDirectories:false), parameters:{numFiles=129, transient_lastDdlTime=1419984079, COLUMN_STATS_ACCURATE=false, numRows=-1, totalSize=170482370617, rawDataSize=-1}) Time taken: 0.994 seconds, Fetched: 9 row(s)
显示出来某个partition对应的hdfs地址等,使用的InputFormat等详细信息。
关于外部表创建的语句,完整内容大概如下:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name (col_name data_type, ...) [PARTITIONED BY (col_name data_type, ...)] [CLUSTERED BY (col_name, col_name, ...)] [SORTED BY (col_name, col_name, ...)] [ROW FORMAT row_formart] [STORED AS file_format] [LOCATION hdfs_path] [AS select_statement]
当然,也可以通过使用Like复制一个已经存在的表定义:
CREATE [EXTERNAL] TABLE [IF NOT EXIST] table_name LIKE existing_table name [LOCATION hdfs_path]
其中各个语句的含义如下:
- CREATE TABLE:创建一个指定名字的表名。如果已经存在,使用IF NOT EXIST来忽略抛出的异常
- EXTERNAL:创建一个外部表,也就是说在创建一个表的同时指定一个指向实际数据的路径。
- LIKE:允许复制一个已经存在的表的定义,而不复制表中已经存在的内容。
- PARTITIONED BY:建立带有分区的表。
- CLUSTERED:对表和分区进行类聚操作。
- SORT BY:根据某个字段进行排序,可以提高数据的查询效率。
如果要使用特定的InputFormat,还需要加入下面的语句:
INPUTFORMAT 'xxxHiveInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/aaa/hive-table'
这样就指定InputFormat和OutputFormat,以及外部表的Location。其中InputFormat与Hadoop中的略有不同,其中的RecordReader需要特殊继承Hive中的
org.apache.hadoop.hive.ql.io.HiveContextAwareRecordReader
可以做一个Adaptor来将原有的RecordReader进行适配以满足Hive查询的要求。
Hive中的分隔符
hive 默认的字段分隔符为ascii码的控制符\001,建表的时候用fields terminated by '\001',如果要测试的话,造数据在vi 打开文件里面,用ctrl+v然后再ctrl+a可以输入这个控制符\001。按顺序,\002的输入方式为ctrl+v,ctrl+b。以此类推。
当前我们新建的Hive表中,默认fields terminated by没有设置,那么就使用'\001'。
比如我们的一条日志,表面上看起来没有问题:
cat a.log tp=imp^ti=1419076654^md=iPhone3,1^__tid=5zKN0REAy8M%253D^mh=640.00x960.00^me=7.1.2^mf=84fef4314602f88b90dad8f2a9d4b23dv1.1t1419076650kcom.qiyi.iphone^mk=1^plt=1^mn=iphone^m9=128f0ab5^os=i^mm=31.892004x119.898267x50.000000^mp=com.qiyi.iphone^e=i___m^mo=1^m5=9920F2E3-4BDB-430F-BCC3-6ACF6EC6F155^kt=mma^mt=1419076649529^a=UoNVX034P723^rawIp=222.185.12.59^mw=1^j=zh^k=2001515^av=11^ip=222.185.12.59^m0=604a45ed52a06f1535711e3c68a130f2edc^pf=c1^p=101324851^pu=m^pn=iphone^rt=2^uuid=9920f2e3-4bdb-430f-bcc3-6acf6ec6f155^po=http%3a%2f%2fmlt01.com%2fo.htm%3fpv%3d0%26sp%3d0%2c1195912%2c1199754%2c2213157%2c0%2c1%2c1^ag=34
但是通过cat -A(--show-all),就可以看出所有的隐藏字符:
cat -A a.log tp=imp^ti=1419076654^md=iPhone3,1^__tid=5zKN0REAy8M%253D^mh=640.00x960.00^me=7.1.2^mf=84fef4314602f88b90dad8f2a9d4b23dv1.1t1419076650kcom.qiyi.iphone^mk=1^plt=1^mn=iphone^m9=128f0ab5^os=i^mm=31.892004x119.898267x50.000000^mp=com.qiyi.iphone^e=i___m^mo=1^m5=9920F2E3-4BDB-430F-BCC3-6ACF6EC6F155^kt=mma^mt=1419076649529^a=UoNVX034P723^rawIp=222.185.12.59^mw=1^j=zh^k=2001515^av=11^ip=222.185.12.59^m0=604a45ed52a06f15357^A11e^@^@^@^@3c68a130f2edc^pf=c1^p=101324851^pu=m^pn=iphone^rt=2^uuid=9920f2e3-4bdb-430f-bcc3-6acf6ec6f155^po=http%3a%2f%2fmlt01.com%2fo.htm%3fpv%3d0%26sp%3d0%2c1195912%2c1199754%2c2213157%2c0%2c1%2c1^ag=34$
而其中看到的^A就是'\001'的表示(实际上是一个字符),这样外部表中该行数据^A前面的字符被截断导致该行数据只能显示前半部分。
最终的简单解决方法便是重写InputFormat,替换掉可能会导致问题的字符串特殊字符。
相关推荐
然而,在加载数据到Hive表中时,我们可能会遇到多字节分隔符问题,即数据中的分隔符不是单字节的,而是多字节的。这种情况下,Hive默认的单字节分隔符无法识别多字节分隔符,导致数据加载错误。 本文将介绍Hive多...
然而,在Hive 3.0+版本中,由于采用了Log4j2作为默认的日志框架,开启审计日志的过程与Hive 1.0中使用Log4j有所不同。 在Hive 3.0+中,我们需要编辑`hive-log4j2.properties`配置文件来实现审计日志功能。以下是一...
基于Hive的搜狗日志分析 本文档主要介绍了基于Hive的搜狗日志分析的整个过程,从数据预处理、构建数据仓库、数据分析到其他数据操作等方面进行了详细的介绍。 一、 数据预处理 数据预处理是整个日志分析的第一步...
文档编写目的 Hive在0.14及以后版本支持字段的多分隔符,参考: ... 而Fayson在以前的文章中也基于C5...如何将多个字符作为字段分割符的数据文件加载到Hive表中,示例数据如下: 字段分隔符为“@#$” test1@#$test1name@#$t
针对传统分布式模型在海量日志并行处理时的可扩展性和并行程序编写困难的问题, 提出了基于Hive的Web海量搜索日志分析机制。利用HQL语言以及Hadoop分布式文件系统(HDFS)和MapReduce编程模式对海量搜索日志进行分析...
这里使用了制表符`\t`作为字段之间的分隔符,并指定了数据文件的具体存储位置。 #### 三、数据导入 完成表结构的定义后,下一步是将实际的日志数据导入到Hive表中。这通常可以通过两种方式实现: 1. **上传数据文件...
实验中创建了一个名为`stocks`的内部表,字段分隔符为英文逗号。表结构包括`exchange`、`symbol`、`ymd`、`price_open`、`price_high`、`price_low`、`price_close`、`volume`和`price_adj_close`等字段,数据类型...
- **处理边界情况**:如果找不到更多的分隔符,则默认将`@location`设置为字符串的长度加1,以便正确截取出最后一个子字符串。 - **返回子字符串**:利用`SUBSTRING`函数根据`@start`和`@location`的值截取第n个子...
【Hive函数重要应用案例1】本章主要探讨在Hive中处理特殊数据格式的技巧,特别是...综上,本章将详细介绍如何在Hive中应对各种复杂的分隔符问题,以及如何利用不同函数和工具处理特殊数据格式,以满足实际业务需求。
Hadoop/Hive系统通过HDFS存储Web日志数据,并通过Hive处理这些数据,最终实现日志分析的功能。 设计Web日志分析系统时,需要考虑到以下几个核心功能模块: 1. 日志采集模块:负责实时或定时从Web服务器获取日志...
该实验数据主要用于Hive进行Apache Web日志的统计分析学习使用,数据量不是大。
需要注意的是,在 Hadoop 平台上迁移数据到 Hive 目录时,默认分隔符为逗号(`,`),为了避免数据解析错误,建议在创建表时指定自定义的分隔符,例如 Tab 键(`\t`)。 **示例代码**: ```sql CREATE TABLE rcth ...
- **字段分隔符**:表的字段分隔符默认为 `\001`,接口层表应保持源文件的字段分隔符。空值应使用 `SERDEPROPERTIES('serialization.null.format' = '')` 处理,确保数据导出的准确性。 - **分区表结构**:分区表...
WinCE恢复默认HIVE注册表的方法,wince恢复注册表,好东西
本案例中,我们探讨的是如何通过 Hive 分析 Hadoop 集群的日志,并解决在 Eclipse 中运行时遇到的权限问题。该问题表现为:“Access denied for user 'hivenew'@'172.16.2.36' (using password: YES)”,这通常意味...
在大数据处理领域,Hive是一种基于Hadoop的数据仓库工具,它允许用户使用SQL类的语言(称为HiveQL)对大规模数据...这对于理解大数据处理流程,提升数据分析技能,以及在实际工作中应用Hive解决复杂问题具有重要意义。
Hive优化案例、Hive数据处理模式、Hive常见问题与优化、Hive实践 Hive是一种基于Hadoop的数据仓库工具,用于对大规模数据进行处理和分析。在大数据时代,Hive的应用非常广泛,本文将从Hive优化案例、Hive数据处理...