例項功能說明:
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()