Свойство parquet.block.size
влияет только на авторов паркета.С другой стороны, команда hdfs dfs -cp
копирует файлы независимо от их содержимого.Поэтому свойство parquet.block.size
игнорируется hdfs dfs -cp
.
Представьте, что у вас есть приложение, которое делает снимки экрана в формате JPG или PNG, в зависимости от файла конфигурации.Вы делаете копию этих скриншотов с помощью команды cp
.Естественно, даже если вы измените желаемый формат изображения в файле конфигурации, команда cp
всегда будет создавать выходные файлы в формате изображения исходных файлов, независимо от файла конфигурации.Файл конфигурации используется только приложением, создающим снимок экрана, а не cp
.Вот как работает свойство parquet.block.size
.
Чтобы изменить размер блока, нужно переписать файл.Вы упомянули, что у вас есть spark-shell
.Используйте это, чтобы переписать файл Parquet, выполнив
sc.hadoopConfiguration.setInt("parquet.block.size", 67108864)
var df = spark.read.parquet("/path/to/input.parquet")
df.write.parquet("/path/to/output")
Обновление : так как вы упомянули в комментариях ниже, что он не работает для вас, я провел эксперимент и опубликовал стенограмму сеансаниже:
$ spark-shell
scala> sc.hadoopConfiguration.setInt("parquet.block.size", 200000)
scala> var df = spark.read.parquet("/tmp/infile.parquet")
df: org.apache.spark.sql.DataFrame = [field0000: binary, field0001: binary ... 78 more fields]
scala> df.write.parquet("/tmp/200K")
scala> df.write.format("parquet").mode("Overwrite").options(Map("parquet.block.size" -> "300000")).save("/tmp/300K")
scala> :quit
$ hadoop fs -copyToLocal /tmp/{200K,300K} /tmp
$ parquet-tools meta /tmp/infile.parquet | grep "row group" | head -n 3
row group 1: RC:4291 TS:5004800 OFFSET:4
row group 2: RC:3854 TS:4499360 OFFSET:5004804
row group 3: RC:4293 TS:5004640 OFFSET:10000000
$ parquet-tools meta /tmp/200K/part-00000-* | grep "row group" | head -n 3
row group 1: RC:169 TS:202080 OFFSET:4
row group 2: RC:168 TS:201760 OFFSET:190164
row group 3: RC:169 TS:203680 OFFSET:380324
$ parquet-tools meta /tmp/300K/part-00000-* | grep "row group" | head -n 3
row group 1: RC:254 TS:302720 OFFSET:4
row group 2: RC:255 TS:303280 OFFSET:284004
row group 3: RC:263 TS:303200 OFFSET:568884
Посмотрев на значения TS, вы увидите, что входной файл имеет размер группы строк 4,5-5M, а выходные файлы имеют размеры групп строк 200K и 300K соответственно.Это показывает, что значение, установленное с помощью sc.hadoopConfiguration
, становится «по умолчанию», в то время как другой метод, упомянутый в комментарии ниже, включающий df.options
, переопределяет это значение по умолчанию.
Обновление 2 : сейчасчто вы опубликовали свой вывод, я вижу, что происходит.В вашем случае происходит сжатие, увеличивая объем данных, которые будут помещаться в группы строк.Размер группы строк применяется к сжатым данным, но TS показывает размер несжатых данных.Однако вы можете определить размер групп строк, вычтя их начальные смещения.Например, сжатый размер вашей первой группы строк составляет 59176084 - 4 = 59176080 байт или меньше (поскольку заполнение также может иметь место).Я скопировал ваши результаты в /tmp/rowgroups.dat на моем компьютере и рассчитал размеры вашей группы строк, введя следующую команду:
$ cat /tmp/rowgroups.dat | sed 's/.*OFFSET://' | numinterval
59176080
60809783
29408673
64243499
63585828
54864199
57684584
38374804
55453519
(Команда numinterval
находится в пакете num-utils
в Ubuntu.) Как видите, все ваши группы строк меньше указанного вами размера группы строк.(Причиной, по которой они не имеют точно указанного размера, является PARQUET-1337 .)