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()

 


posted @ 2024-07-15 18:08  gaussen126  阅读(16)  评论(0编辑  收藏  举报