pyspark 开发实例--融合3种等级类型API(rdd api - dataframe api - SQL api)
实例功能说明:
1,使用pyspark 开发了一个数据ETL ,分析的练习项目。
2,实例功能为,从mysql读取表数据,按照一定规则进行ETL。 以csv格式保存到 hadoop.
并特别的使用了Spark提供的3种API进行统计分析,分别是RDD算子,Dataframe算子, SQL编程算子, 进行了数量统计,
3, 组件版本:
pyspark: 3.3.1
python: 3.9
# Imports from pyspark.sql import SparkSession # Create SparkSession spark = SparkSession.builder \ .appName('SparkByExamples.com') \ .config("spark.jars", "mysql-connector-java-5.1.28.jar") \ .getOrCreate() # Read from MySQL Table table_df = spark.read \ .format("jdbc") \ .option("driver", "com.mysql.jdbc.Driver") \ .option("url", "jdbc:mysql://134.98.6.21:9200/hesc_stm_xhm") \ .option("dbtable", "temp_user_grid") \ .option("user", "root") \ .option("password", "*****dx") \ .load() # check read accessable # print( table_df.count()) # 总行数 # etl 使用rdd 算子 rdd = table_df.rdd # print(rdd.first()) rdd1 = rdd.filter(lambda r: Row.asDict(r).get("cityCode") != None).filter( lambda r: len(Row.asDict(r).get("cityCode")) == 9) # print(rdd.map(lambda r: Row.asDict(r).get("cityCode")).take(5)) # ROW类型的元素读取 使用 r(19)读取列有问题 def checkCityCode(str): # 判断字符串的格式,前3位为001,而且全为数字 if (str[:3] == '001') and str.isnumeric(): return True else: return False # 过滤RDD rdd2 = rdd1.filter(lambda r: checkCityCode(Row.asDict(r).get("cityCode"))) # 函数使用错误 print(rdd2.first()) # 写入文件系统 # target = "D:\program\logs\table_data.txt" # rdd2.toDF().write.format("CSV").mode("overwrite").options(header=True).save(target) # 刻意使用了 rdd df算子 sql 三种算子 ; 统计不同网格的人员数量。 # rdd operator map = rdd2.map(lambda r: (Row.asDict(r).get("gridCode"), Row.asDict(r).get("id"))).countByKey() print(map) # 查询python rdd api # mapPartitions, 对分区计算,分区太大不合适,内存不足。 比如写入数据,可以避免建立很多连接。 # df/ds operator dataset 1.6之后加入, 整合了RDD 的强类型便于使用lambda函数以及 sqpark sql 优化引擎 # dataframe是 dataset 的 一种。 dataframe 适用python . 以下把rdd转为为 dataframe.继续分组聚合。 df = rdd2.toDF() df1 = df.groupBy('gridCode').count() # dataframe 特定编程语言 对结构化数据操作, 也称 无类型dataset算子 df1.show(4)
# 继续转化数据集,保存为spark内临时表,继续用SQL算子进行开发计算 # sql operator df.createOrReplaceTempView('temp_user_grip') df2 = spark.sql("select gridCode, count(id) from temp_user_grip group by gridCode") df2.show(2) spark.stop()
---一------步-----一 ------个-----脚--------印----------