使用火花流传输(每5分钟),我将数据作为拼花形式存储在HDFS中。
/ data / yyyy-MM-dd / *。parquet
例如:/ data / 2020-02-02 / * parquet
每个镶木地板文件的大小仅以KB为单位
每个文件夹最多可包含288个实木复合地板文件。
我们通常读取过去24小时,过去7天,过去1个月等的数据。
使用spark读取数据时,我检查了分区号。假设我正在检查上个月的数据,每个文件夹中有288个文件,并且正在创建288个分区。
[当我尝试将数据重新分区为30时,它减少到只有180。
有没有办法为一个文件夹创建一个分区。
例如:当我读取最近30天的数据时。有什么办法可以读取30个分区的数据。如果7天7个分区。
我的首选解决方案是使用partitionBy
函数:
import org.apache.spark.sql.functions._
val df = spark.range(1,100).withColumn("myPartition", col("id")%10)
// saving with one file per partition
df.repartition(1, $"myPartition")
.write
.mode("append")
.partitionBy("myPartition")
.parquet("output/data")
这应该创建
# hadoop fs -ls output/data
output/data/myPartition=0
output/data/myPartition=1
...
output/data/myPartition=9
每个有一个实木复合地板文件。