SparkSQL和Hive语法差异
1、仅支持Hive
- SparkSQL关联条件on不支持函数
rand()
- 创建零时表时,Spark不支持直接赋值
null
- Spark无法读取字段类型为
void
的表 - SparkSQL中如果表达式没有指定别名,SparkSQL会将整个表达式作为别名,如果表达式中包含特殊字符(如逗号)。则
CTAS建表
会失败
2、仅支持SparkSQL
SparkSQL允许在join on条件中使用or等不等式值关联语句,Hive中不允许,只能用等值关联
3、相同函数差异
- Spark运行时用到的hash函数,与hive的哈希算法不同,如果使用hash(),结果和hive的hash()会有差异
- Hive和sparkSQL使用grouping sets生成的grouping_id不一致
- regexp_extract未匹配上的话,hive里回的是null,但是在spark里返回的是空字符
- sparkSQL中的row_number的over中不能省略sort by 或order by
- grouping_id()函数生成的数据不同
- 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()