从Spark DataFrame中获取n行数据并传递给toPandas()函数

81

我有这段代码:

l = [('Alice', 1),('Jim',2),('Sandra',3)]
df = sqlContext.createDataFrame(l, ['name', 'age'])
df.withColumn('age2', df.age + 2).toPandas()

功能良好,能够满足要求。但是假设我只想显示前n行,然后调用toPandas()返回一个pandas数据帧,我该怎么办呢?我不能调用take(n),因为它不会返回数据帧,因此我无法将其传递给toPandas()

换句话说,我如何从数据帧中获取前n行,并在结果数据帧上调用toPandas()?我觉得这应该不难,但我想不出来。

我正在使用Spark 1.6.0。

3个回答

140

您可以使用limit(n)函数:

l = [('Alice', 1),('Jim',2),('Sandra',3)]
df = sqlContext.createDataFrame(l, ['name', 'age'])
df.limit(2).withColumn('age2', df.age + 2).toPandas()

或者:

l = [('Alice', 1),('Jim',2),('Sandra',3)]
df = sqlContext.createDataFrame(l, ['name', 'age'])
df.withColumn('age2', df.age + 2).limit(2).toPandas()

9
假设重新运行数据框架的限制为2的函数(data frame.limit(2))总是返回相同的结果,这种做法并不安全(它是不确定的)。我尝试过这样做,并陷入了数小时的调试中。 - Karan Sharma
@KaranSharma 这是否意味着当我们使用 limit(n) 时,我们是随机选择 n 行而不是返回前 n 行? - haneulkim
1
@haneulkim 是的,你说得对。Limit 会随机选择它想要的行。 - Karan Sharma

18
你可以使用head方法获取Spark DataFrame的前几行,然后创建Pandas DataFrame。
l = [('Alice', 1),('Jim',2),('Sandra',3)]
df = sqlContext.createDataFrame(l, ['name', 'age'])

df_pandas = pd.DataFrame(df.head(3), columns=df.columns)

In [4]: df_pandas
Out[4]: 
     name  age
0   Alice    1
1     Jim    2
2  Sandra    3

5
head()limit()之间有显著差异吗? - jamiet
6
head函数返回前n行,类似于take函数,而limit函数则将结果Spark DataFrame限制为指定数量的行。在这种情况下,使用limit函数可能更合适。 - Anton Protopopov
7
limithead之间的区别在于它们被用于不同的情境。limit使用于查询语句中,用于限制返回结果的行数,而head通常用于类似文件或流等数据结构中,表示数据的开头部分。 - Anton Protopopov
3
好的,容易理解。因此limit()是一种转换操作,而head()则是一种动作操作。感谢Anton。 - jamiet

-5

试一下:

def showDf(df, count=None, percent=None, maxColumns=0):
    if (df == None): return
    import pandas
    from IPython.display import display
    pandas.set_option('display.encoding', 'UTF-8')
    # Pandas dataframe
    dfp = None
    # maxColumns param
    if (maxColumns >= 0):
        if (maxColumns == 0): maxColumns = len(df.columns)
        pandas.set_option('display.max_columns', maxColumns)
    # count param
    if (count == None and percent == None): count = 10 # Default count
    if (count != None):
        count = int(count)
        if (count == 0): count = df.count()
        pandas.set_option('display.max_rows', count)
        dfp = pandas.DataFrame(df.head(count), columns=df.columns)
        display(dfp)
    # percent param
    elif (percent != None):
        percent = float(percent)
        if (percent >=0.0 and percent <= 1.0):
            import datetime
            now = datetime.datetime.now()
            seed = long(now.strftime("%H%M%S"))
            dfs = df.sample(False, percent, seed)
            count = df.count()
            pandas.set_option('display.max_rows', count)
            dfp = dfs.toPandas()    
            display(dfp)

用法示例包括:

# Shows the ten first rows of the Spark dataframe
showDf(df)
showDf(df, 10)
showDf(df, count=10)

# Shows a random sample which represents 15% of the Spark dataframe
showDf(df, percent=0.15) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接