文章目录
- Spark SQL/Hive SQL与SQL的关系
- HSQL与普通SQL的区别
- Hive,HDFS,Hadoop,MapReduce的关系
- Hadoop和Spark的区别和联系
- 数据类型
- Hsql函数
- 数组函数
- 字符串函数
- 优化查询
Spark SQL/Hive SQL与SQL的关系
SQL:Structured Query Language,用于对关系型数据库进行操作的标准化语言。不同数据库对应不同类型的SQL。
Spark SQL/Hive SQL:Spark使用的数据存储是Hive,因此Spark SQL即Hive SQL,具有其自身的一些标准和使用方法。
HSQL与普通SQL的区别
- HSQL不支持等值链接,即不能省略join,如:
SQL中内关联可以这样写:select * from a , b where a.key = b.key
Hive中应该这样写:select * from a join b on a.key = b.key
- HiveQL中String类型的字段若是空(empty)字符串, 长度为0, 那么其is null的判断结果是False,使用left join可以进行筛选行
- HQL不支持行级别的增insert into、改update、删delete,Hive仅支持覆盖重写整个表:
insert overwrite 表 (重写覆盖)
- HSQL支持写入分区
- Hive表与数据库不同,hive存在重复记录,需要distinct
- spark sql在select from时需指定database.tablename,普通SQL只需要select from tablename。(在join on table1.feature = table2.feature时都不需要指定database)。
Hive,HDFS,Hadoop,MapReduce的关系
- MapReduce:一种计算模式
- Hadoop:实现了MapReduce模式的分布式计算的开源框架
- HDFS:Hadoop的分布式文件系统
- HIve:对HDFS上数据进行分析管理的数据仓库架构,将HDFS的文件映射为table,在hive数据仓库生成对应目录,并提供基于HSQL的数据查询功能,将SQL转化为MapReduce操作,完成复杂的数据分析工作。
Hadoop和Spark的区别和联系
- 联系:Hadoop和Spark都是分布式数据处理的架构
- 区别:Hadoop基于HDFS文件系统,每次从磁盘读取数据,进行一次数据处理后写入磁盘,再读取;Spark从磁盘中读取数据,中间结果以rdd形式存储在内存中,因此Spark速度更快,而Hadoop容错性更高。
数据类型
除rdd外,Spark SQL提供了一种DataFrame(此处与Python中的dataframe不同,两者有不同的属性和操作)。
DataFrame是存放row对象的RDD,每个Row对象代表一行记录。
DataFrame:
7. 使用SQL创建DataFrame
df=spark_session.sql(‘sql’)
8. 将rdd转化为df
df = rdd.toDF()
9. df创建视图(类似数据表)
view=df.createOrReplaceTempView(‘viewName’)
10. 将最终的查找结果(df)写入hive
df.write.format(“hive”).mode(“append”).partitionBy(‘date’).saveAsTable(table_name)
rdd:
- 将df转化为rdd
rdd1=df.rdd.repartition(200) - 调用函数返回新的rdd
rdd2=rdd1.mapPartitions(function)
Hsql函数
数组函数
- array_contains(数组,值):判断某值是否在数组中
- array_intersect(数组,数组):返回两个数组的交集
- size(数组):返回数组内元素个数,可判断数组是否为空(不可以用array != []判断)
- locate(子字符串,字符串):返回子字符串位于字符串的index>0,如果不存在则返回0,可用于判断是都存在该子字符串
- Lateral view + explode(数组):把数组字段拆分成以元素为字段的不同行
> select
> distinct company_id,download
> from
> company_to_host LATERAL VIEW explode(download_host_set) adTable as download
- sort_array(数组):返回元素排序后的数组
字符串函数
- String (not) in (str1,str2,…):判断字符串是否在这些字符串中
- substring(str, ‘/’, index):返回str的第index个’/'之前的子字符串
- cast(something as string):将其他类型的字段转化为string类型
- levenshtein(str1,str2):编辑距离
优化查询
- 多个表先后join时,先join小表(过滤条件比较多的表),再join大表
- Hive表与数据库不同,hive存在重复记录,需要distinct
- 检查是否存在数据倾斜,将数据量特别大的特殊key排除