我是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的文件)
我的目的是使用列(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中做。正确的实现方法是什么?
答案 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。