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 要截取的字符串的长度