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}