Spark DataFrame的操作
实验操作步骤
1、读取csv文件,并创建dataframe
sc = SparkContext()
sqlContext = SQLContext(sc)
reader = sqlContext.read
df_emp = reader.schema("emp_id String, emp_name String, gender String, emp_age int, emp_job String, salary float, dept_id String").csv(path=r"C:\Users\LYW\Desktop\emp.csv")
df_dept = reader.schema("dept_id String,dept_name String").csv(path=r"C:\Users\LYW\Desktop\dept.csv")
在运行python文件的时候竟然报SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: tr这个错误
其实引起这个错误的原因就是转义的问题。当时写的是:
path = "C:\Users\LYW\Desktop\dept.csv"
原因分析:在windows系统当中读取文件路径可以使用,但是在python字符串中\有转义的含义,我们需要采取一些方式使得\不被解读为转义字符。
解决方法:
1、在路径前面加r,即保持字符原始值的意思。
path = r"C:\Users\LYW\Desktop\dept.csv"
2、替换为双反斜杠
path = "C:\\Users\LYW\Desktop\dept.csv"
3、替换为正斜杠
path = "C:/Users/LYW/Desktop/dept.csv"
2、实验代码:
# coding=gbk
import findspark
findspark.init()
from pyspark import SparkContext
from pyspark import SQLContext
# 读取csv文件,并创建dataframe
sc = SparkContext()
sqlContext = SQLContext(sc)
reader = sqlContext.read
df_emp = reader.schema("emp_id String, emp_name String, gender String, emp_age int, emp_job String, salary float, dept_id String").csv(path=r"C:\Users\LYW\Desktop\emp.csv")
df_dept = reader.schema("dept_id String,dept_name String").csv(path=r"C:\Users\LYW\Desktop\dept.csv")
# 第一问
print("1.查出该单位当前设置有哪些岗位,按照岗位名称降序排列")
df_emp.select("emp_job").sort("emp_job", ascending=False).distinct().show()
# 第二问
print("2.查询所有员工的基本信息,字段包括:部门编号,部门名称,员工编号,姓名,性别,年龄,岗位,薪水,先按照部门编号升序排列,再按员工编号升序排列")
df = df_dept.join(other=df_emp, on="dept_id", how="inner") df.select("*").orderBy(df.dept_id.asc(), df.emp_id.asc()).show()
# 第三问
print("3.找出所有姓刘的员工信息,字段包括:部门编号,部门名称,员工编号,姓名,性别,年龄,岗位,薪水,先按照部门编号升序排列,再按员工编号升序排列")
# df.filter("substr(emp_name,0,1)='刘'").orderBy(df.dept_id.asc(), df.emp_id.asc()).show()
df.select("*").filter(df.emp_name.like("刘%")).orderBy(df.dept_id.asc(), df.emp_id.asc()).show()
# 第四问
print("4.找出年龄在25岁以下,并且工资在2000~3000范围内的员工信息,字段包括:部门编号,部门名称,员工编号,姓名,性别,年龄,岗位,薪水,按照薪水降序排列")
df.filter("emp_age < 25 and salary > 2000 and salary < 3000").orderBy(df.salary.desc()).show()
# 第五问 print("5.统计各个部门的平均工资,平均年龄,字段包括部门编号,部门名称,平均年龄,平均工资,按照部门号排序")
df.groupby("dept_id", "dept_name").mean("emp_age", "salary").orderBy(df.dept_id.asc()).show()
substr()函数:(字符截取函数)
substr(string string, int a, int b)
1、string 需要截取的字符串
2、a 截取字符串的开始位置(注:当a等于0或1时,都是从第一位开始截取)
3、b 要截取的字符串的长度