Pyspark groupby Dataframe并应用函数编写文件(如熊猫)

时间:2018-10-17 09:45:15

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

我是pyspark的新手。我想对两列进行分组,然后将所有结果写入一个文件(或一列写入多个文件)

代码:

df = df.withColumn('day', date_format(from_unixtime(df.time_create/1000),'yyyy-MM-dd').alias('day'))
gp = df.groupby(['store_id', 'day']).count()
gp.write.csv('hdfs://xxxx:9000/clean/orders.csv')

数据想要

| store_id | day        |
| a        | 2018-01-02 |
| a        | 2018-01-03 |
| a        | 2018-01-03 |
| a        | 2018-01-04 |
| b        | 2018-01-02 |
| c        | 2018-01-03 |
| c        | 2018-01-03 |

结果想要

| store_id | day        |  count | 
| ---      | ---        | --- |
| a        | 2018-01-02 |  1   |
| a        | 2018-01-03 |   2   |
| a        | 2018-01-04 |   1   |
| b        | 2018-01-02 |   1    |
| c        | 2018-01-03 |   2   |

但是它导致了一个名为orders.csv的文件夹,其中包含很多大文件(熊猫有6MB的文件)

enter image description here

我的目的是使用列(store_id, date , count)保存csv,但不要太大(pandas有6MB的文件)。 最好在列store_id中按文件名(date , count)保存。

如果使用pandas,我可以使用

def func(df):
    df.groupby('day').count().to_csv(df.store_id[0]+'.csv')
df.groupby(['store_id']).apply(func)

我想用我的熊猫代码使spark写入文件(也可以合二为一),但是不知道如何在pyspark中做。正确的实现方法是什么?

1 个答案:

答案 0 :(得分:0)

128 MB不是文件大小。它是Hadoop的块大小。请单击一个文件以查看单个大小。

文件数取决于数据帧的分区数。例如:

l =[( 'a'        ,'2018-01-02' ),
( 'a'        , '2018-01-03' ),
( 'a'        , '2018-01-03' ),
( 'a'        , '2018-01-04' ),
( 'b'        , '2018-01-02' ),
( 'c'        , '2018-01-03' ),
( 'c'        , '2018-01-03' )]

df = spark.createDataFrame(l, ['store_id','day'])
gp = df.groupby(['store_id', 'day']).count()
print("Will create that many files: " + str(gp.rdd.getNumPartitions()))
gp.write.csv('/tmp/bla/orderho')
gp = gp.repartition(1)
print("Will create that many files: " + str(gp.rdd.getNumPartitions()))
gp.write.csv('/tmp/bla/ordersha')

如上面的示例所示,您可以使用数据框方法repartition来调整该行为。但是请记住,spark是为分布式计算优化的,因此不能替代Pandas。