Apache spark Spark:保存按“分区”的数据帧;虚拟的;柱

Apache spark Spark:保存按“分区”的数据帧;虚拟的;柱,apache-spark,dataframe,pyspark,apache-spark-sql,partitioning,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,Partitioning,我正在使用PySpark执行经典的ETL工作(加载数据集、处理它、保存它),并希望将我的数据帧保存为由“虚拟”列分区的文件/目录;我所说的“虚拟”是指我有一个列时间戳,它是一个包含ISO8601编码日期的字符串,我想按年/月/日进行分区;但我实际上在数据框中没有年、月或日列;我有这个时间戳,可以从中派生这些列,但我不希望我的resultat项序列化其中一个列 将数据帧保存到磁盘时产生的文件结构应如下所示: / year=2016/ month=01/

我正在使用PySpark执行经典的ETL工作(加载数据集、处理它、保存它),并希望将我的数据帧保存为由“虚拟”列分区的文件/目录;我所说的“虚拟”是指我有一个列时间戳,它是一个包含ISO8601编码日期的字符串,我想按年/月/日进行分区;但我实际上在数据框中没有年、月或日列;我有这个时间戳,可以从中派生这些列,但我不希望我的resultat项序列化其中一个列

将数据帧保存到磁盘时产生的文件结构应如下所示:

/ 
    year=2016/
        month=01/
            day=01/
                part-****.gz

有没有办法让Spark/Pyspark实现我想要的功能?

用于分区的列不包括在序列化数据本身中。例如,如果您像这样创建
DataFrame

df=sc.parallelize([
(1,“foo”,2.0,“2016-02-16”),
(2,“酒吧”,3.0,“2016-02-16”)
]).toDF([“id”、“x”、“y”、“日期”])
并写如下:

导入临时文件
从pyspark.sql.functions导入col、dayofmonth、month、year
outdir=tempfile.mktemp()
dt=列(“日期”)。铸造(“日期”)
fname=[(年),(月),(月日),(日)]
exprs=[col(“*”)+[f(dt)。f的别名(name),fname中的名称]
(df)
.选择(*exprs)
写
.partitionBy(*(名称为_,名称为fname))
.格式(“json”)
.save(outdir))
单个文件不包含分区列:

导入操作系统
(sqlContext.read)
.json(os.path.join(outdir,“年=2016/月=2/日=16/”)
.printSchema())
##根
##|--date:string(nullable=true)
##|--id:long(nullable=true)
##|--x:string(nullable=true)
##|--y:double(nullable=true)
分区数据只存储在目录结构中,不会在序列化文件中重复。只有在读取完整或部分目录树时,才会附加它:

sqlContext.read.json(outdir.printSchema())
##根
##|--date:string(nullable=true)
##|--id:long(nullable=true)
##|--x:string(nullable=true)
##|--y:double(nullable=true)
##|--year:整数(nullable=true)
##|--month:整数(nullable=true)
##|--day:integer(nullable=true)
sqlContext.read.json(os.path.join(outdir,“year=2016/month=2/”)).printSchema()
##根
##|--date:string(nullable=true)
##|--id:long(nullable=true)
##|--x:string(nullable=true)
##|--y:double(nullable=true)
##|--day:integer(nullable=true)

我是python新手。有没有一种方法可以在路径中不包含年=、月=、日=的情况下执行此操作?我了解这其中的大部分内容@deanw,你找到解决“年=”月=”等问题的方法了吗?@Pablo a不幸的是没有。我需要进一步划分,所以在:年-月-日-上午/下午之前。知道怎么做吗?