其实把hive做到shell里面最大的优势是可以定时执行,比如之前做一个论坛用户日志分析的时候,需要定时对hive导入数据,并在hive里面对数据做预处理,最后把hive处理的数据导入到hbase中 这样的实现起来用java显然就没有用shell有优势,因为shell写好了丢那 执行linux定时任务就好了,但是shell有个明显的缺陷就是不灵活,不能根据需求和功能做灵活调用,这时候做到java里面就比用shell写死的好很多,比如做即时需求,点某个功能按键的时候就需要跑hive,明显就是java更好嘛
Hadoop处理完全依赖于MapReduce框架,这要求用户了解Java编程的高级样式,以便成功查询数据。Apache Hive背后的动机是简化查询,并将Hadoop非结构化数据开放给公司中更广泛的用户群。
Hive有三个主要功能:数据汇总,查询和分析。它支持名为HiveQL或HQL的语言表达的查询,HQL是一种声明性的类SQL语言,在其第一个版本中,它自动将SQL样式的查询转换为在Hadoop平台上执行的MapReduce。此外,HiveQL支持自定义MapReduce脚本,以便查询。
当通过Hive提交SQL查询时,它们最初由创建会话句柄的驱动程序组件接收,通过Java数据库连接/开放数据库连接接口将请求转发给编译器,随后转发作业以供执行。Hive支持数据序列化/反序列化,并通过包含名为Hive-Metastore的系统目录来提高模式设计的灵活性。
SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
序列化是对象转换为字节序列的过程。
序列化是字节序列恢复为对象的过程。
对象的序列化主要有两种用途:对象的持久化,即把对象转换成字节序列后保存到文件中;对象数据的网络传送。
除了上面两点, hive的序列化的作用还包括:Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。
SerDe说明hive如何去处理一条记录,包括Serialize/Deserilize两个功能, Serialize把hive使用的java object转换成能写入hdfs的字节序列,或者其他系统能识别的流文件。Deserilize把字符串或者二进制流转换成hive能识别的java object对象。比如:select语句会用到Serialize对象, 把hdfs数据解析出来;insert语句会使用Deserilize,数据写入hdfs系统,需要把数据序列化。
hive创建表时, 通过自定义的SerDe或使用Hive内置的SerDe类型指定数据的序列化和反序列化方式。
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], )]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], )]
[CLUSTERED BY (col_name, col_name, )
[SORTED BY (col_name [ASC|DESC], )]
INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
如上创建表语句, 使用row format 参数说明SerDe的类型。
Avro
ORC
RegEx
Thrift
Parquet
CSV
JsonSerDe
自定义类型使用的步骤:
以上就是关于hadoop hive *** 作 是封装在shell脚本好还是java中好全部的内容,包括:hadoop hive *** 作 是封装在shell脚本好还是java中好、Apache Hive的工作原理是什么、Hive系列之SerDe等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)