HiveQL与SQL区别

转自:http://www.aboutyun.com/thread-7327-1-1.html

1、Hive不支持等值连接

  SQL中对两表内联可以写成:select * from dual a,dual b where a.key = b.key;
   
Hive中应为:select * from dual a join dual b on a.key = b.key;
   
而不是传统的格式:SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2
2、分号字符
   
分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:select concat(key,concat(‘;‘,key)) from dual;
但HiveQL在解析语句时提示:FAILED: Parse Error: line 0:-1 mismatched input ‘<EOF>‘ expecting ) in function specification,解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:select concat(key,concat(‘\073‘,key)) from dual;
3、IS [NOT] NULL
   
SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.
4、Hive不支持将数据插入现有的表或分区中,
仅支持覆盖重写整个表,示例如下:

INSERT OVERWRITE TABLE t1
SELECT * FROM t2; 

5、hive不支持INSERT INTO 表 Values(), UPDATE, DELETE操作
    尽量避免使用很复杂的锁机制来读写数据:INSERT INTO就是在表或分区中追加数据。
6、hive支持嵌入mapreduce程序,来处理复杂的逻辑

1 FROM (
2 MAP doctext USING ‘python wc_mapper.py‘ AS (word, cnt)
3 FROM docs
4 CLUSTER BY word
5 ) a
6 REDUCE word, cnt USING ‘python wc_reduce.py‘;  

doctext: 是输入,word, cnt: 是map程序的输出,CLUSTER BY: 将wordhash后,又作为reduce程序的输入,并且map程序、reduce程序可以单独使用,如:

1 FROM (
2 FROM session_table
3 SELECT sessionid, tstamp, data
4 DISTRIBUTE BY sessionid SORT BY tstamp
5 ) a
6 REDUCE sessionid, tstamp, data USING ‘session_reducer.sh‘;  

DISTRIBUTE BY: 用于给reduce程序分配行数据。

7、hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录
   
这样能免除多次扫描输入表的开销。

FROM t1  

INSERT OVERWRITE TABLE t2
SELECT t3.c2, count(1)
FROM t3
WHERE t3.c1 <= 20
GROUP BY t3.c2  

INSERT OVERWRITE DIRECTORY ‘/output_dir‘
SELECT t3.c2, avg(t3.c1)
FROM t3
WHERE t3.c1 > 20 AND t3.c1 <= 30
GROUP BY t3.c2  

INSERT OVERWRITE LOCAL DIRECTORY ‘/home/dir‘
SELECT t3.c2, sum(t3.c1)
FROM t3
WHERE t3.c1 > 30
GROUP BY t3.c2;  

实际实例

一、创建一个表
CREATE TABLE u_data (
userid INT,
movieid INT,
rating INT,
unixtime STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘/t‘
STORED AS TEXTFILE;
下载示例数据文件,并解压缩
wget http://www.grouplens.org/system/files/ml-data.tar__0.gz
tar xvzf ml-data.tar__0.gz

二、加载数据到表中:
LOAD DATA LOCAL INPATH ‘ml-data/u.data‘ OVERWRITE INTO TABLE u_data;

三、统计数据总量:
SELECT COUNT(1) FROM u_data;

四、现在做一些复杂的数据分析:
创建一个 weekday_mapper.py: 文件,作为数据按周进行分割
import sys
import datetime
for line in sys.stdin:
line = line.strip()
userid, movieid, rating, unixtime = line.split(‘/t‘)

五、生成数据的周信息
weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()
print ‘/t‘.join([userid, movieid, rating, str(weekday)])

六、使用映射脚本
//创建表,按分割符分割行中的字段值
CREATE TABLE u_data_new (
userid INT,
movieid INT,
rating INT,
weekday INT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘/t‘;
//将python文件加载到系统
add FILE weekday_mapper.py;

七、将数据按周进行分割
INSERT OVERWRITE TABLE u_data_new
SELECT
TRANSFORM (userid, movieid, rating, unixtime)
USING ‘python weekday_mapper.py‘
AS (userid, movieid, rating, weekday)
FROM u_data;

SELECT weekday, COUNT(1)
FROM u_data_new
GROUP BY weekday;

八、处理Apache Weblog 数据
将WEB日志先用正则表达式进行组合,再按需要的条件进行组合输入到表中
add jar ../build/contrib/hive_contrib.jar;

CREATE TABLE apachelog (
host STRING,
identity STRING,
user STRING,
time STRING,
request STRING,
status STRING,
size STRING,
referer STRING,
agent STRING)
ROW FORMAT SERDE ‘org.apache.hadoop.hive.contrib.serde2.RegexSerDe‘
WITH SERDEPROPERTIES (
"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^
/"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^
/"]*|/"[^/"]*/"))?",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE

时间: 2024-08-30 05:20:43

HiveQL与SQL区别的相关文章

hql 跟 sql 区别

hql 跟 sql 区别  1.hql与sql的区别 sql 面向数据库表查询 hql 面向对象查询 hql : from 后面跟的 类名+类对象 where 后 用对象的属性做条件 sql: from 后面跟的是表名   where 后 用表中字段做条件 查询        在Hibernate中使用查询时,一般使用Hql查询语句. HQL(Hibernate Query Language),即Hibernate的查询语言跟SQL非常相像.不过HQL与SQL的最根本的区别,就是它是面向对象的.

HQL和SQL区别

1.hql是面向 对象 查询,大小写敏感:  sql是面向 数据库 查询,对大小写不敏感,约定关键字大写. 2.hql的语法结构:from + 类名 + 类对象 + where + 类对象属性的条件: sql的语法结构:from + 数据库表名 + where + 表字段条件. 3.新增:hql不需要再用insert语句,只需构造新增对象后调用save()方法. 4.修改:hql不需要再用update语句,只需得到修改对象后调用update()方法. 5.删除:hql不需要再用delete语句,

spark结构化数据处理:Spark SQL、DataFrame和Dataset

本文讲解Spark的结构化数据处理,主要包括:Spark SQL.DataFrame.Dataset以及Spark SQL服务等相关内容.本文主要讲解Spark 1.6.x的结构化数据处理相关东东,但因Spark发展迅速(本文的写作时值Spark 1.6.2发布之际,并且Spark 2.0的预览版本也已发布许久),因此请随时关注Spark SQL官方文档以了解最新信息. 文中使用Scala对Spark SQL进行讲解,并且代码大多都能在spark-shell中运行,关于这点请知晓. 概述 相比于

hive(3)HiveQL数据定义

HiveQL与传统SQL区别 HiveQL是Hive的查询语言.与mysql的语言最接近,但还是存在于差异性,表现在:Hive不支持行级插入操作.更新操作和删除操作,不支持事物. 基本语法 数据库操作 1.创建数据库hive> create database test; 或者 create database if not exists test;2.查看数据库对应的目录文件创建的数据库对应的数据目录或者存储在hdfs的目录为在hive配置文件里面定义的hive.metastore.warehou

Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南

Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完成特殊优化.可以通过SQL.DataFrames API.Datasets API与Spark SQL进行交互,无论使用何种方式,SparkSQL使用统一的执行引擎记性处理.用户可以根据自己喜好,在不同API中选择合适的进行处理.本章中所有用例均可以在spark-shell.pyspark shel

Spark1.1.0 Spark SQL Programming Guide

Spark SQL Programming Guide Overview Getting Started Data Sources RDDs Inferring the Schema Using Reflection Programmatically Specifying the Schema Parquet Files Loading Data Programmatically Configuration JSON Datasets Hive Tables Performance Tuning

Spark SQL数据源

SparkSQL数据源:从各种数据源创建DataFrame 因为 spark sql,dataframe,datasets 都是共用 spark sql 这个库的,三者共享同样的代码优化,生成以及执行流程,所以 sql,dataframe,datasets 的入口都是 sqlContext. 可用于创建 spark dataframe 的数据源有很多: SparkSQL数据源:RDD val sqlContext = new org.apache.spark.sql.SQLContext(sc)

12.spark sql之读写数据

简介 ??Spark SQL支持多种结构化数据源,轻松从各种数据源中读取Row对象.这些数据源包括Parquet.JSON.Hive表及关系型数据库等. ??当只使用一部分字段时,Spark SQL可以智能地只扫描这些字段,而不会像hadoopFile方法一样简单粗暴地扫描全部数据. Parquet ??Parquet是一种流行的列式存储格式,可以高效地存储具有嵌套字段的记录.Parquet自动保存原始数据的类型,当写入Parquet文件时,所有的列会自动转为可空约束. scala // Enc

Spark SQL, DataFrames and Datasets 指南

概述 Spark SQL 是 Spark 处理结构化数据的模块; 与基础的 Spark RDD API 不同, Spark SQL 提供的接口提供给 Spark 更多的关于数据和执行计算的结; 内在的, Spark SQL 使用这些额外的信息去执行额外的优化; 这里有几种包括 SQL 和 Datasets API 在内的与 Spark SQL 交互的方法; 当计算结果使用相同的执行引擎, 独立于你使用的表达计算的 API/语言; 这种统一意味着开发者可以依据哪种 APIs 对于给定的表达式提供了