当前位置: 首页 > 知识库问答 >
问题:

镶木地板内部构件

莫振
2023-03-14

我有一个数据帧,它是由运行特定日期的每日批处理创建的,然后保存在HDFS(Azure Data Lake Gen 2)中。

它是用这样的东西保存的

TradesWritePath="abfss://refined@"+datalakename+".dfs.core.windows.net/curated/clientscoredata/clientscoredatainput/Trades/" + TradeDatedt + "/Trades_" + tradedateInt + ".parquet"
tradesdf.write.mode("overwrite").parquet(TradesWritePath)

如您所见,我没有对数据帧进行分区,因为它只包含一个日期。

例如,第一天的第一个文件将存储在文件夹中

交易/2019/08/25

然后第二天,它就会在文件夹里

贸易/2019/08/26

问题是,当所有数据都放好后,日期上的过滤器谓词是否仍会被按下,HDFS是否会知道在哪里查找数据,而不是进行完全扫描?

或者,即使我保存了一天,我仍然必须使用分区选项进行编写,只是为了让Spark在阅读时理解并将其推送到HDFS,HDFS也知道在哪里可以找到它(而不是全扫描)?

问题的下一部分是:

当我查看存储拼花文件的文件夹时,我看到了很多小的“部分-****. snappy.parquet文件。我通过阅读这里的一些论坛问题了解到,如果我必须减少文件的数量,我必须使用“重新分区”选项。但问题是——有必要吗?我读到太多的小文件当然会影响性能,所以一种选择是将其保存在128 MB的块中(如果我不确定数据将如何用于下游,即目前哪些列),这样HDFS中的NameNode就不会负担过重,我们也不会有太大的文件。这也适用于这些“时髦的镶木地板分区文件”吗?

太多的概念,我仍在努力寻找最好的解决方案,将这些数据帧存储为拼花,因此任何见解都将不胜感激。

共有2个答案

壤驷坚
2023-03-14

您不应该创建自己的目录。

在编写拼花地板时,使用分区来按日期进行分区。它将自动处理目录创建,并且在读取时不会扫描整个表。

对于问题的第二部分,是的,我们的想法是将每个分区保持在128MB左右,但老实说,这不会花费太多,您可以将默认分区保持在200。

黄弘盛
2023-03-14

如果数据存储为

root/    
   date=ddmmyy/
   date=dd1mm1yy1/
...

符号很重要。谓词下推不能使用任意目录结构。必须采用上述格式。

在你的例子中

您需要存储以下内容

  root/
      Trades=2019/08/25
      Trades=2019/08/26

Spark利用hive分区发现机制来检测表中的分区。Hive分区需要以特定方式放置数据。

进入问题的下一部分。无论文件的类型如何,将小文件保存在HDFS中都是非常糟糕的。是的,对于snappy分区文件来说确实如此。您应该使用重新分区coalesce函数来保持文件大小接近128

namenode的职责是跟踪HDFS中的所有文件。HDFS中的块大小为128

 类似资料:
  • 我有一个avro格式的数据流(json编码),需要存储为镶木地板文件。我只能这样做, 把df写成拼花地板。 这里的模式是从json中推断出来的。但是我已经有了avsc文件,我不希望spark从json中推断出模式。 以上述方式,parquet文件将模式信息存储为StructType,而不是avro.record.type。是否也有存储avro模式信息的方法。 火花 - 1.4.1

  • 问题内容: 有没有办法从Java创建镶木地板文件? 我的内存中有数据(java类),我想将其写入一个Parquet文件中,以便以后从apache-drill中读取它。 有没有简单的方法可以做到这一点,例如将数据插入sql表? 得到它了 谢谢您的帮助。 结合答案和此链接,我能够创建一个实木复合地板文件并用钻头将其读回。 问题答案: 不建议使用ParquetWriter的构造函数(1.8.1),但不建

  • 有没有一种方法可以直接从基于avro模式的parquet文件在Amazon Athena中创建表?模式被编码到文件中,所以我需要自己实际创建DDL看起来很愚蠢。 我看到了这个,还有另一个复制品 但它们与Hive直接相关,这对雅典娜不起作用。理想情况下,我正在寻找一种以编程方式执行此操作的方法,而无需在控制台上定义它。

  • 我的 hdfs 中有 Parquet 文件。我想将这些镶木地板文件转换为csv格式

  • 我对火花有点陌生。在我的spark calc完成后,我目前在amazon s3上看到一些奇怪的缓慢的拼花。 写一个小文件需要1.8小时(写时有2个分区) 我用一个不同的更大的文件(更多行更多列)运行了相同的spark calc(编写时有3个分区) 写入调用本身:

  • 我正在尝试创建一个数据管道,其中incomng数据存储在parquet中,我创建了一个外部配置单元表,用户可以查询配置单元表并检索数据。我可以保存parquet数据并直接检索它,但当我查询配置单元表格时,它不会返回任何行。我做了以下测试设置: -创建外部配置单元表创建外部表emp ( id double,hire_dt时间戳,用户字符串)存储为parquet location '/test/EMP