PySpark CheatSheet-Spark DataFrame等Spark類型數據結構轉其他數據結構

1. Spark DataFrame轉numpy array:

先轉換成pandas DataFrame,然後再轉換成numpy array

import pandas as pd
import numpy as np
df=spark.createDataFrame([(101,1,16), (102,2,13),(103,5,19), (104,4,22)], ['ID','A','B'])
pandas_df = df.toPandas()
np_matrix = df.toPandas().values

2. Spark DataFrame轉出:

先用collect()函數轉換成list of Rows,然後每個row的每個字段的訪問就像Python的dict,也可以像python的list。

比如:

df=spark.createDataFrame([(101,1,16), (102,2,13),(103,5,19), (104,4,22)], ['ID','A','B'])
for row in df.collect():
    print(row['B'])
16
13
for row in df.collect():
    print(row[2])
16
13

3. Spark DataFrame 動態寫入分區表的多分區

如果建立了名爲spark的sparkSession,那麼:

# 如果是自己建立SparkSession,建立的時候可以這樣,第二個config就可以保證打開動態分區
warehouseLocation = 自己的數據倉庫目錄
spark = SparkSession.builder \
        .appName("xxx") \
        .config("spark.sql.warehouse.dir", warehouseLocation) \
        .config("spark.hadoop.hive.exec.dynamic.partition.mode", True) \ 
        .enableHiveSupport() \
        .getOrCreate() 

# 打開動態分區設置
spark.sql("set hive.exec.dynamic.partition=true")
spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
# 寫表命令如下:
df_final_pop.repartition(分區字段).write.insertInto(target_table, overwrite=True)
# 比如:
df_final_pop.repartition('dt', 'sku_type','cid3').write.insertInto(target_table, overwrite=True)

# 如果表沒有建立,想通過spark命令直接建立,可以試試吧insertInto改爲saveAs,自己沒有嘗試過。

4. Row轉Dict

df=spark.createDataFrame([(101,1,16), (102,2,13),(103,5,19), (104,4,22)], ['ID','A','B'])
row_0 = df.collect()[0]
dict_1 = row_0.asDict()
dict_2 = df.collect()[0].asDict()
#########################################################################################
# result is:
dict_1
{'A': 1, 'B': 16, 'ID': 101}
dict_2
{'A': 1, 'B': 16, 'ID': 101}

 

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