pySpark創建DataFrame的方式

                              pySpark創建DataFrame的方式

有時候需要在迭代的過程中將多個dataframe進行合併(union),這時候需要一個空的初始dataframe。創建空dataframe可以通過spark.createDataFrame()方法來創建:

# 先定義dataframe各列的數據類型
from pyspark.sql.types import *
schema = StructType([
        StructField("a", IntegerType(), True),
        StructField("b", IntegerType(), True),
        StructField("c", IntegerType(), True)])

# 通過定義好的dataframe的schema來創建空dataframe
df1 = spark.createDataFrame(spark.sparkContext.emptyRDD(), schema)

df2 = sc.parallelize([(4,5,6)]).toDF(['a','b','c'])

df1.union(df2).show()
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  4|  5|  6|
+---+---+---+

通過上面的方法可以創建指定列名和數據類型的dataframe。但是有時候我們需要創建的dataframe的數據結構是跟某個dataframe結構是相同的,而這個結構有非常複雜,難以直接創建,這時候就可以直接使用已有的dataframe的schema來創建新的dataframe了:

df3 = spark.createDataFrame(spark.sparkContext.emptyRDD(), df2.schema)
df3.union(df2).show()
+---+---+---+
|  a|  b|  c|
+---+---+---+
|  4|  5|  6|
+---+---+---+

對於Spark 2.0來說,所有的功能都可以以類SparkSession類作爲切入點。要創建SparkSession,只需要使用SparkSession.builder()

使用Spark Session,應用程序可以從現有的RDD,Hive表或Spark數據源創建DataFrame,Spark SQL可以使用DataFrame接口在各種數據源上運行。使用Spark SQL DataFrame,我們可以創建一個臨時視圖。在DataFrame的臨時視圖中,可以對數據運行SQL查詢。

Spark SQL DataFrame API沒有提供編譯時類型安全性。因此,如果結構未知,就無法操縱數據,一旦我們將域對象轉換爲數據幀,就不可能重新生成域對象; Spark SQL中的DataFrame API提高了Spark的性能和可伸縮性。它避免了爲數據集中的每一行構造單個對象的垃圾收集成本。


from pyspark import SparkContext     
from pyspark.sql import SparkSession 
from pyspark.sql.types import StructType, StructField, LongType, StringType
from pyspark.sql import Row
from pyspark.sql import Column
import pandas as pd
import numpy as np

# 創建SparkSession連接到Spark集羣-SparkSession.builder.appName('name').getOrCreate()
spark=SparkSession \
.builder \
.appName('my_app_name') \
.getOrCreate()

# 創建DataFrame,可以從不同的數據創建,以下進行對個數據源讀取創建說明

def create_json_file():
    df=pd.DataFrame(np.random.rand(5,5),columns=['a','b','c','d','e']).applymap(lambda x: int(x*10))
    file=r"random.csv"
    df.to_csv(file,index=False)

def create_df_from_rdd():
    # 從集合中創建新的RDD
    stringCSVRDD = spark.sparkContext.parallelize([
                    (123, "Katie", 19, "brown"),
                    (456, "Michael", 22, "green"),
                    (789, "Simone", 23, "blue")])

    # 設置dataFrame將要使用的數據模型,定義列名,類型和是否爲能爲空
    schema = StructType([StructField("id", LongType(), True),
                        StructField("name", StringType(), True),
                        StructField("age", LongType(), True),
                        StructField("eyeColor", StringType(), True)])
    # 創建DataFrame
    swimmers = spark.createDataFrame(stringCSVRDD,schema)
    # 註冊爲臨時表
    swimmers.registerTempTable("swimmers")
    # 使用Sql語句
    data=spark.sql("select * from swimmers")
    # 將數據轉換List,這樣就可以查看dataframe的數據元素的樣式
    print(data.collect())
    # 以表格形式展示數據
    data.show()
    
    print("{}{}".format("swimmer numbers : ",swimmers.count()) )

def create_df_from_json():
    '''
    read的類型是DataFrameReader
    '''
    df = spark.read.json('pandainfo.json')
    df.show()

def create_df_from_csv():
    df=spark.read.csv('random.csv',header=True, inferSchema=True)
    df.show()

def create_df_from_postgres():
    """
    format : 指定數據源格式 - 如 jdbc , json , csv等
    options: 爲數據源添加相關特性選項
    """
    df=spark.read.format('jdbc').options(
        url='jdbc:postgresql://localhost:5432/northwind',
        dbtable='public.orders',
        user='postgres',
        password='iamroot'
    ).load()

    df.show()

def create_df_from_mysql():
    """
    """
    df=spark.read.format('jdbc').options(
        url='jdbc:mysql://localhost:3306',
        dbtable='mysql.db',
        user='root',
        password='iamneo'
        ).load()

    df.show()

def create_df_from_pandas():
    """
    從Python pandas獲取數據
    """
    df = pd.DataFrame(np.random.random((4,4)))
    spark_df = spark.createDataFrame (df,schema=['a','b','c','d'])
    spark_df.show()

def create_df_from_hive(hive):
    # 創建支持Hive的Spark Session
    appName = "PySpark Hive Example"
    master = "local"

    spark = SparkSession.builder \
    .appName(appName) \
    .master(master) \
    .enableHiveSupport() \
    .getOrCreate()

    df = spark.sql("select * from test_db.test_table")
    df.show()

    # 將數據保存到Hive新表
    df.write.mode("overwrite").saveAsTable("test_db.test_table2")
    # 查看數據
    spark.sql("select * from test_db.test_table2").show()


if __name__=='__main__':
    create_json_file()
    create_df_from_rdd() 
    create_df_from_csv()
    create_df_from_json()
    create_df_from_db()
    create_df_from_mysql()
    create_df_from_pandas()

 

參考:
https://stackoverflow.com/questions/54503014/how-to-get-the-schema-definition-from-a-dataframe-in-pyspark

https://www.jianshu.com/p/f79838ddb534

https://blog.csdn.net/sinat_26811377/article/details/101217071



 

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