我的数据采用相对较小的Avro记录形式,用Parquet文件编写(平均<1mb)。
到目前为止,我使用本地文件系统对Spark进行了一些测试。
我使用目录层次结构对数据进行了分区。
我想知道&#34; build&#34;是否会更好分区到Avro记录并累积更大的文件...但是我想像分区的Parquet文件会#34; map&#34;到HDFS分区文件也是如此。
哪种方法最好?
编辑(根据评论澄清):
&#34;在Avro记录上构建分区&#34;:想象我的目录结构是P1 = / P2 = /file.avro,并且Avro记录包含字段F1和F2。我可以将所有这些保存在包含字段P1,P2,F1和F2的单个Avro文件中。即,不需要具有目录的分区结构,因为它存在于Avro记录中
关于Parquet分区和HDFS分区:HDFS会在不同的机器上拆分一个大的Parquet文件,它会对应不同的Parquet分区吗? (我不知道这是否澄清了我的问题 - 如果不是这意味着我不是真的明白了)
答案 0 :(得分:0)
在文件夹级别使用分区的主要原因是,当Spark for instance读取数据并且分区列上有一个过滤器(从文件夹名称中提取,只要格式为path / partitionName = value)它将只读取所需的文件夹(而不是阅读所有内容然后应用过滤器)。因此,如果您想使用此机制,请在文件夹结构中使用层次结构(我经常使用它)。
一般来说,我建议避免使用包含少量数据的许多文件夹(不确定这里是否属实)
关于Spark输入分区(相同的单词含义不同),当从HDFS读取时,Spark会尝试读取文件,以便分区与HDFS上的文件匹配(以防止混乱),因此如果数据被HDFS分区,则spark会匹配相同的分区。据我所知,HDFS不对文件进行分区而是复制它们(以提高可靠性)所以我认为单个大型镶木地板文件将转换为HDFS上的单个文件,除非您重新分区或定义分区数,否则它将被读入单个分区阅读时(有几种方法可以根据Spark版本进行操作。请参阅this)