我有过去5年的monthly
收入数据,并且我以append
模式、partitioned by
month
列、parquet
存储各个月份的 Dataframe 。
def Revenue(filename):
df = spark.read.load(filename)
.
.
df.write.format('parquet').mode('append').partitionBy('month').save('/path/Revenue')
Revenue('Revenue_201501.csv')
Revenue('Revenue_201502.csv')
Revenue('Revenue_201503.csv')
Revenue('Revenue_201504.csv')
Revenue('Revenue_201505.csv')
df
每月以parquet
存储,如下所示-
**问题:**如何删除与特定月份对应的parquet
文件夹?
一种方法是在一个大的df
中加载所有这些parquet
文件,然后使用.where()
子句过滤掉那个特定的月份,然后在overwrite
模式下将其保存回parquet``partitionBy
month,如下所示-
# If we want to remove data from Feb, 2015
df = spark.read.format('parquet').load('Revenue.parquet')
df = df.where(col('month') != lit('2015-02-01'))
df.write.format('parquet').mode('overwrite').partitionBy('month').save('/path/Revenue')
但是,这种方法相当麻烦。
另一种方法是直接删除那个特定月份的文件夹,但我不确定这是否是一种正确的方法,以免我们以一种不可预见的方式改变metadata
。
删除特定月份的parquet
数据的正确方法是什么?
3条答案
按热度按时间wpcxdonn1#
Spark支持删除分区,包括数据和元数据。
引用scala代码注解
在您的情况下,没有备份表。我们可以将 Dataframe 注册为临时表,并使用上面的语法(临时表文档)
在pyspark中,我们可以使用以下链接中的语法运行SQL示例:
ddrv8njm2#
下面的语句将只删除与分区信息相关的元数据。
如果你想删除数据,你需要把你的配置单元外部表的tblproperties设置为False。2它会把你的配置单元表设置为托管表。
您可以将其设置回外部表。
我尝试使用spark session设置给定属性,但遇到了一些问题。
我相信一定有办法做到这一点。我最终使用了Python。我在PysPark中定义了下面的函数,它完成了这项工作。
这将同时删除元数据和数据。注意。我已经用HiveORC外部分区表测试过了,它在loaded_date分区
更新:基本上你的数据是躺在hdfs位置的子目录命名为
等等
oug3syen3#
如果你想在pyspark中完成而不使用配置单元表,你可以按照以下步骤完成:
1-获取新数据的分区
2-检查其对应的 parquet 分区是否存在并删除
3-以附加方式写入
因此,这里我假设'month'是 Dataframe 中的分区列:
我使用Databricks笔记本,因此我使用“dbutils.fs.rm”删除文件夹(分区)。