在Python的環境下對Spark文件操作

在實際使用Spark做集羣運算的時候我們會遇到很多實際的問題,特記錄下來,本文主要講解關於Spark讀文件爲RDD ,然後RDD轉DataFrame,然後將RDD存爲文件,以及如何保存DataFrame到文件 

from pyspark.sql import SparkSession

def CreateSparkContext():
    # 構建SparkSession實例對象
    spark = SparkSession.builder \
        .appName("SparkSessionExample") \
        .master("local") \
        .getOrCreate()
    # 獲取SparkContext實例對象
    sc = spark.sparkContext
    return sc

def save_rdd_to_file(rdd,path):
    #保存RDD數據,這裏指定的路徑tmp2文件夾必須是不存在的,否則會報錯,因爲創建的時候會自動創建
    return rdd.saveAsTextFile(path)

def read_file_to_RDD(sc,files_path):
    return sc.textFile(files_path)

def transform_rdd_to_DF(rdd,columns_list):
    df=rdd.toDF(columns_list)
    return df 

def save_DF(df,path,sep="|"):
    #將df保存輸出的時候coalesce(1)的意思就是將輸出到文件都放在一起而不進行拆分,如果不指定在大數據量的情況下文件輸出會自動拆分
    df.coalesce(1).write.csv(path=path, header=False, sep=sep, mode='overwrite')

if __name__ == "__main__":
    # 獲取SparkContext實例對象
    sc = CreateSparkContext()
    # 讀取數據到RDD 
    raw_ratings_rdd  = read_file_to_RDD(sc,"/data/lin/train_data/movie_test/u.csv")
    #查看RDD數據的行數和第一行數據
    print(raw_ratings_rdd.count())

    print(raw_ratings_rdd.first())

    # 獲取評分數據前三個字段,構建Rating實例對象,RDD轉DataFrame
    ratings_rdd = raw_ratings_rdd.map(lambda line: line.split(',')[0:3])
    columns_list = ["user","product","rating"]
    ratings_rdd_df=transform_rdd_to_DF(ratings_rdd ,columns_list)
    #print(ratings_rdd.first())
    try:
        print("start save the RDD data")
        save_rdd_to_file(ratings_rdd,"/data/lin/predict_data/tmp/tmp2")
        #保存DataFrame
        print("start save DataFrame")
        
        save_DF(ratings_rdd_df,"/data/lin/predict_data/tmp/tmp1")

    except Exception as e:
        print(str(e))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章