该 parquet.block.size 财产只影响Parquet作家。该 hdfs dfs -cp 另一方面,命令复制文件而不管其内容。该 parquet.block.size 因此忽略了财产 hdfs dfs -cp 。
parquet.block.size
hdfs dfs -cp
想象一下,根据配置文件,您有一个以JPG或PNG格式截取屏幕截图的应用程序。你用这个截图复制这些截图 cp 命令。当然,即使您在配置文件中更改了所需的图像格式,也可以 cp 命令将始终以原始文件的图像格式创建输出文件,而不管配置文件如何。配置文件仅由屏幕截图应用程序使用,而不是由 cp 。这是怎么回事 parquet.block.size 财产也有效。
cp
你可以做些什么来改变块大小是重写文件。你提到过你 spark-shell 。使用它通过发出重写Parquet文件
spark-shell
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 覆盖此默认值。
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上的软件包。)如您所见,您的所有行组都小于您指定的行组大小。 (它们不完全是指定大小的原因是 实木复合地板1337 。)
numinterval
num-utils