如果我调用map或mapPartition
并且我的函数从PySpark接收行,那么创建本地PySpark或Pandas DataFrame的自然方式是什么?结合行并保留架构的东西?
目前我做的事情如下:
def combine(partition):
rows = [x for x in partition]
dfpart = pd.DataFrame(rows,columns=rows[0].keys())
pandafunc(dfpart)
mydf.mapPartition(combine)
答案 0 :(得分:2)
Spark> = 2.3.0
从Spark 2.3.0开始,可以按分区或组使用Pandas Series
或DataFrame
。例如见:
Spark< 2.3.0 强>
创建本地PySpark
的自然方式是什么?
没有这样的事情。 Spark分布式数据结构不能嵌套,或者您更喜欢不能嵌套操作或转换的另一个透视图。
或Pandas DataFrame
相对简单,但你必须记住至少一些事情:
collections.OrderedDict
不同)。因此传递列可能无法按预期工作。import pandas as pd
rdd = sc.parallelize([
{"x": 1, "y": -1},
{"x": -3, "y": 0},
{"x": -0, "y": 4}
])
def combine(iter):
rows = list(iter)
return [pd.DataFrame(rows)] if rows else []
rdd.mapPartitions(combine).first()
## x y
## 0 1 -1
答案 1 :(得分:1)
您可以使用toPandas()
,
pandasdf = mydf.toPandas()
答案 2 :(得分:0)
要创建spark SQL数据帧,您需要一个hive上下文:
hc = HiveContext(sparkContext)
使用HiveContext,您可以通过inferSchema函数创建SQL数据帧:
sparkSQLdataframe = hc.inferSchema(rows)
答案 3 :(得分:0)
实际上可以将Spark行转换为执行器内的Pandas&最后使用mapPartitions
从这些输出中创建Spark DataFrame。 See my gist in Github
# Convert function to use in mapPartitions
def rdd_to_pandas(rdd_):
# convert rows to dict
rows = (row_.asDict() for row_ in rdd_)
# create pandas dataframe
pdf = pd.DataFrame(rows)
# Rows/Pandas DF can be empty depending on patiition logic.
# Make sure to check it here, otherwise it will throw untrackable error
if len(pdf) > 0:
#
# Do something with pandas DataFrame
#
pass
return pdf.to_dict(orient='records')
# Create Spark DataFrame from resulting RDD
rdf = spark.createDataFrame(df.rdd.mapPartitions(rdd_to_pandas))