Spark SQL/Hive SQL

Spark SQL/Hive SQL与SQL的关系

SQL:Structured Query Language,用于对关系型数据库进行操作的标准化语言。不同数据库对应不同类型的SQL。

Spark SQL/Hive SQL:Spark使用的数据存储是Hive,因此Spark SQL即Hive SQL,具有其自身的一些标准和使用方法。

HSQL与普通SQL的区别

  1. HSQL不支持等值链接,即不能省略join,如:
    SQL中内关联可以这样写: select * from a , b where a.key = b.key
    Hive中应该这样写: select * from a join b on a.key = b.key
  2. HiveQL中String类型的字段若是空(empty)字符串, 长度为0, 那么其is null的判断结果是False,使用left join可以进行筛选行
  3. HQL不支持行级别的增insert into、改update、删delete,Hive仅支持覆盖重写整个表:insert overwrite 表 (重写覆盖)
  4. HSQL支持写入分区
  5. Hive表与数据库不同,hive存在重复记录,需要distinct
  6. spark sql在select from时需指定database.tablename,普通SQL只需要select from tablename。(在join on table1.feature = table2.feature时都不需要指定database)。

Hive,HDFS,Hadoop,MapReduce的关系

  1. MapReduce:一种计算模式
  2. Hadoop:实现了MapReduce模式的分布式计算的开源框架
  3. HDFS:Hadoop的分布式文件系统
  4. HIve:对HDFS上数据进行分析管理的数据仓库架构,将HDFS的文件映射为table,在hive数据仓库生成对应目录,并提供基于HSQL的数据查询功能,将SQL转化为MapReduce操作,完成复杂的数据分析工作。

Hadoop和Spark的区别和联系

  1. 联系:Hadoop和Spark都是分布式数据处理的架构
  2. 区别: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:

  1. 将df转化为rdd
    rdd1=df.rdd.repartition(200)
  2. 调用函数返回新的rdd
    rdd2=rdd1.mapPartitions(function)

Hsql函数

数组函数

  1. array_contains(数组,值):判断某值是否在数组中
  2. array_intersect(数组,数组):返回两个数组的交集
  3. size(数组):返回数组内元素个数,可判断数组是否为空(不可以用array != []判断)
  4. locate(子字符串,字符串):返回子字符串位于字符串的index>0,如果不存在则返回0,可用于判断是都存在该子字符串
  5. Lateral view + explode(数组):把数组字段拆分成以元素为字段的不同行
> select 
>     distinct company_id,download 
>     from
>     	company_to_host LATERAL VIEW explode(download_host_set) adTable as download
  1. sort_array(数组):返回元素排序后的数组

字符串函数

  1. String (not) in (str1,str2,…):判断字符串是否在这些字符串中
  2. substring(str, ‘/’, index):返回str的第index个’/'之前的子字符串
  3. cast(something as string):将其他类型的字段转化为string类型
  4. levenshtein(str1,str2):编辑距离

优化查询

  1. 多个表先后join时,先join小表(过滤条件比较多的表),再join大表
  2. Hive表与数据库不同,hive存在重复记录,需要distinct
  3. 检查是否存在数据倾斜,将数据量特别大的特殊key排除
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值