一個pyspark 開發練習例項

gaussen126發表於2024-07-15
例項功能說明:
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()


相關文章