SparkSQL和Hive语法差异

SparkSQL和Hive语法差异

1、仅支持Hive

  1. SparkSQL关联条件on不支持函数rand()
  2. 创建零时表时,Spark不支持直接赋值null
  3. Spark无法读取字段类型为void的表
  4. SparkSQL中如果表达式没有指定别名,SparkSQL会将整个表达式作为别名,如果表达式中包含特殊字符(如逗号)。则CTAS建表会失败

2、仅支持SparkSQL

SparkSQL允许在join on条件中使用or等不等式值关联语句,Hive中不允许,只能用等值关联

3、相同函数差异

  1. Spark运行时用到的hash函数,与hive的哈希算法不同,如果使用hash(),结果和hive的hash()会有差异
  2. Hive和sparkSQL使用grouping sets生成的grouping_id不一致
  3. regexp_extract未匹配上的话,hive里回的是null,但是在spark里返回的是空字符
  4. sparkSQL中的row_number的over中不能省略sort by 或order by
  5. grouping_id()函数生成的数据不同
  6. reflect()函数中,如果入参有非法数据或者null,hive会返回null,而spark会抛出异常

创建DataFrame

Row 类型 表示一行数据

  • datafram就算是多行构成
# Row行数据操作
# 导入行类
from pyspark.sql import Row
							定义每行数据 有两种获取方法=重点
r1 = Row(id=1,name='张三')
r2 = Row(id=2,name='李四')
# 操作每行数据
# 获取对应字段数据
print(r1.id)
print(r1.name)
print(r2['id'])
print(r2['name'])

							定义行数据不指定字段 = 只有一种获取方法
r3 = Row(3,'王五')
print(r3[1])

df.printSchema()

schema表信息(这种指定表信息的更不常用

  • 定义dataframe中的表的字段名和字段类型
# 导入数据类型
from pyspark.sql.types import *
# 定义schema信息
# 使用StructType类进行定义
# add()方法是指定字段信息
# 第一参数,字段名
# 第二个参数,字段信息
# 第三个参数是否允许为空值  默认是True,允许为空
schema_type = StructType().\
    add('id',IntegerType()).\
    add('name',StringType()).\
    add('age',IntegerType(),False)

df.printSchema()
# 导入行类Row
from pyspark.sql import SparkSession, Row
from pyspark.sql.types import *

# 创建行数据
r1 = Row(id=1, name='张三', age=20)
r2 = Row(id=2, name='李四', age=22)
# 创建元数据
schema = StructType(). \
    add('id', IntegerType()). \
    add('name', StringType()). \
    add('age', IntegerType())

# 创建dataframe
# 生成sparksession对象  按照固定写法创建
ss = SparkSession.builder.getOrCreate()
# 使用sparksession对象方法创建df
# createDataFrame 第一参数是一个列表数据,将每行数据放入列表
# 第二个参数指定表元数据信息
# df是一个dataframe类型的对象
df = ss.createDataFrame([r1, r2], schema=schema)

# dataframe数据的操作
# 查看df数据
df.show()  # 查看所有数据,超过20行时,默认只显示20行
# 查看元信息
df.printSchema()
  • 31
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值