如何在保留现有架构的同时从行中创建DataFrame?

时间:2015-12-23 15:26:19

标签: python pandas apache-spark pyspark pyspark-sql

如果我调用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)

4 个答案:

答案 0 :(得分:2)

Spark> = 2.3.0

从Spark 2.3.0开始,可以按分区或组使用Pandas SeriesDataFrame。例如见:

Spark< 2.3.0

  

创建本地PySpark

的自然方式是什么?

没有这样的事情。 Spark分布式数据结构不能嵌套,或者您更喜欢不能嵌套操作或转换的另一个透视图。

  

或Pandas DataFrame

相对简单,但你必须记住至少一些事情:

  • Pandas和Spark DataFrames甚至不等同。这些是不同的结构,具有不同的属性,通常你不能用另一个替换。
  • 分区可以为空。
  • 看起来你正在通过字典。请记住,基本Python字典是无序的(例如,与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))