Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark—将分区数减少到读取的文件夹数_Apache Spark_Spark Streaming_Partition - Fatal编程技术网

Apache spark Spark—将分区数减少到读取的文件夹数

Apache spark Spark—将分区数减少到读取的文件夹数,apache-spark,spark-streaming,partition,Apache Spark,Spark Streaming,Partition,使用spark streaming(每5分钟一次),我将数据存储为HDFS中的拼花地板 /数据/yyyy-MM-dd/*.拼花地板 例如:/data/2020-02-02/*拼花地板 每个拼花文件大小仅以KB为单位 每个文件夹最多可包含288个拼花文件(最多) 我们通常读取过去24小时、过去7天、过去一个月等的数据 当使用spark读取数据时,我已经检查了分区的数量。假设我正在检查最近一个月的数据,每个文件夹中有288个文件,它正在创建288个分区 当我尝试将数据重新分区为30时,它只会减少到1

使用spark streaming(每5分钟一次),我将数据存储为HDFS中的拼花地板

/数据/yyyy-MM-dd/*.拼花地板

例如:/data/2020-02-02/*拼花地板

每个拼花文件大小仅以KB为单位

每个文件夹最多可包含288个拼花文件(最多)

我们通常读取过去24小时、过去7天、过去一个月等的数据

当使用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

每个都有一个拼花文件。

@meniluca…在写入数据时,我使用的是coalesce(1)。但是每5分钟我就写一次数据,我使用spark append模式来写。因此,我每5分钟创建一个新文件,您必须首先在文件夹名中写入分区值,如上面的示例所示。在您的情况下,应该是
/data/date=2020-02-02/*parquet
,然后您必须像上面的示例中那样使用重新分区命令。重新分区(1,$“date”),这将为您提供所需的结果,每天一个分区。请更正您的反馈。不是为了写作。。我有问题中提到的文件夹结构。我有没有办法用30个分区阅读。我也没有否决你的回答,明白了。HDFS文件是不可变的。不幸的是,没有附加到同一个文件,您必须实现自己的逻辑来读取文件夹,并在每次需要写入时重新分区,以便每天有一个文件。最好的方法是在一天结束时写完之后比较文件。唉,这是一个普遍的问题。你可以+1,我很感激:)