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}